曾经一段时间里xml成为了互联网业界内的数据传输格式标准,但是有人对xml提出了质疑,认为xml数据格式比较繁杂,冗长等弊端,于是提出了很多解决方案。
在2001年的时候JSON数据格式就出现了,并且在2006年的时候在互联网业界内开始普及使用,JSON是一种数据传输格式,而不是一门语言,基本上所有的编程语言都支持JSON数据格式。
有效的数据类型
在 JSON 中,值必须是以下数据类型之一:
JSON 的值不可以是以下数据类型之一:
JSON 字符串
JSON 中的字符串必须用双引号包围。
实例:
{ "name":"DaDaXu" }
JSON 数字
JSON 中的数字必须是整数或浮点数。
实例:
{ "age":18 }
JSON 对象
JSON 中的值可以是对象。
实例:
{
"employee":{ "name":"Bill Gates", "age":62, "city":"Seattle" }
}
JSON 数组
JSON 中的值可以是数组。
实例:
{
"employees":[ "Bill", "Steve", "David" ]
}
JSON 布尔
JSON 中的值可以是 true/false。
实例:
{ "sale":true }
JSON null
JSON 中的值可以是 null。
实例:
{ "middlename":null }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_10_26);
try {
//No.1 JSONObject
JSONObject jsonObject = new JSONObject();
jsonObject.put("country", "中国");
jsonObject.put("city", "上海");
jsonObject.put("street", "南京路");
Log.d("MainActivity_10_26", jsonObject.toString());
//No.2 JSONArray
// index索引
JSONArray jsonArray = new JSONArray();
jsonArray.put(0, "1");
jsonArray.put(1, "2");
jsonArray.put(2, "3");
Log.d("MainActivity_10_26", jsonArray.toString());
//复杂的
JSONArray jsonArray1 = new JSONArray();
jsonArray1.put(jsonObject);
Log.d("MainActivity_10_26", jsonArray1.toString());
//解析json数据 JSONObject类型的
String json = "{\"country\":\"中国\",\"city\":\"上海\",\"street\":\"南京路\"}";
JSONObject jsonObject1 = new JSONObject(json);
Log.d("MainActivity_10_26", "Country:" + jsonObject1.getString("country"));
Log.d("MainActivity_10_26", "City:" + jsonObject1.getString("city"));
Log.d("MainActivity_10_26", "Street:" + jsonObject1.getString("street"));
} catch (JSONException e) {
e.printStackTrace();
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp">
<TextView
android:id="@+id/tvcountry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp" />
<TextView
android:id="@+id/tvcity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp" />
<TextView
android:id="@+id/tvstreet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp" />
</LinearLayout>
MainActivity_10_26中:
编写代码之前需要知道:Android中的线程以及Message和Handler相关知识:
Android中的线程:
线程,可以看作是进程的实体,CPU调度资源的基本单位。本质上是一串命令(也就是程序代码),执行线程可以理解为把命令交给操作系统去执行。
Java中的线程:Java中默认一个进程只有一个线程,称之为主线程。其它线程称之为子线程也叫工作线程。
Android中的线程:Android沿用了Java线程模型,Android中主线程也叫UI线程。Android3.0以后,系统要求网络访问必须在子线程中进行。
Android中Message的基本使用
1.什么是Message:
Message是封装了需要传递的数据交由Handler 处理的对象。
2.Message的作用:
用于存放传递的数据;
是主线程和子线程传递数据的载体
3.如何使用Message:
1.初始化Message对象:
方法一. Message message= new Message();//这种就是直接初始化一个Message对象,没有什么特别的。
方法二. Message message= Message.obtain();//从整个Messge池中返回一个新的Message实例,通过obtainMessage能避免重复Message创建对象。
方法三. Messager message= handler.obtaionMessager();//第二种跟第三种其实是一样的,都可以避免重复创建Message对象,所以建议用第二种或者第三种任何一个创建Message对象。
Android中使用Handler场景
Handler使用的生产消费者设计模式
再来看本案例:
这里需要获取的是json对象数据
代码:(此线程是在onCreate方法内的)注释掉的url是解析json数组的
new Thread(new Runnable() {
@Override
public void run() {
try {
//获取json字符串 进行解析处理
URL url = new URL("https://www.rxez8.com/object.json");
// URL url = new URL("https://www.rxez8.com/list.json");
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //与服务器建立连接
connection.setRequestMethod("GET");//设置请求方法
connection.setConnectTimeout(30000);//设置连接超时时间 默认单位为毫秒
connection.connect(); //开启链接
int responseCode = connection.getResponseCode();//获取状态码 根据状态码判断本次请求是否成功
InputStream inputStream = connection.getInputStream();//获取到响应的数据 通过二进制流的形式得到数据 并进行转换
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
inputStream.close();
String data = os.toString();
//将数据发送给Handler Message
Message msg = Message.obtain();
msg.obj = data;
handler.sendMessage(msg);
Log.d("MainActivity_10_26", data);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
Handler:注释掉的内容是解析json数组的
//与onCreate同级
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
TextView tvcountry = findViewById(R.id.tvcountry);
TextView tvcity = findViewById(R.id.tvcity);
TextView tvstreet = findViewById(R.id.tvstreet);
//传递过来的是一段json字符串 这边需要去解析
try {
JSONObject jsonObject = new JSONObject(msg.obj.toString());
tvcountry.setText(jsonObject.getString("country"));
tvcity.setText(jsonObject.getString("city"));
tvstreet.setText(jsonObject.getString("street"));
// JSONArray jsonArray = new JSONArray(msg.obj.toString());
// for (int i = 0; i
// JSONObject item = jsonArray.getJSONObject(i);
// String country = item.getString("country");
// String city = item.getString("city");
// String street = item.getString("street");
// }
} catch (Exception e) {
}
}
};