首先我们访问某一个服务器,或者调用第三方的API 之后会返回一些json数据,我们就要使用android将这些json数据解析出来,然我们更加直观的看懂服务器的数据。
比如下面这一串json数据。
有时候我们得到的json数据格式并不是这么规范,我们就可以到bejsonjson在线格式化这个网站进行json数据的格式化。
或者验证你自己写的一个json数据是否合法。
{
"data": {
"list": [
{
"access_mode": "读写",
"data_type": "int32",
"description": "",
"expect_value": "",
"identifier": "Alerm",
"name": "报警",
"time": "0",
"value": ""
},
{
"access_mode": "只读",
"data_type": "struct",
"description": "",
"expect_value": "",
"identifier": "GeoLocation",
"name": "地理位置",
"time": "1648559138231",
"value": "{\"CoordinateSystem\":1,\"Latitude\":52.21,\"Longitude\":100.45,\"Altitude\":8000}"
}
]
},
"requestId": "4cac35408273446099778a24f35fed95",
"success": true
}
我们也可以参考这个博客。https://www.cnblogs.com/android-deli/p/10167395.html
1 json的一些规则
我们可以当看到在一开始的json字符串里面 是以 { xxxxx xxxxx } 开始的,说明这个是一个json的字符串
还有一些是以 [ xxxx ] 说明这个直接就是一个json数组。
2 JSONObject 解析json
这个是安卓官方提供的一个 对象,用来解析json数据, 不需要导包
这里主要就是用到了两个对象,一个对象是
JSONObject 对象,用来将 json字符串转化为 json对象,这样我们就可以getString(“key”)通过键得到值
JSONArray 用于将json数组字符串转为 一个json数组,这样我们就可以遍历数组了。
比如说:我们吧这个json字符转为先转为JSONObject对象,然后我们就可以通过get
{
"name": "海洋",
"age": 23,
"address": "河南",
"flag": false,
"mylist": [{
"key": "one",
"value": "1"
},
{
"key": "two",
"value": "2"
},
{
"key": "two",
"value": "2"
}
]
}
按钮的点击事件
public class MainActivity3 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
/**
* 定义一个json
* {
* "name": "海洋",
* "age": 23,
* "address": "河南",
* "flag": false,
* "mylist": [{
* "key": "one",
* "value": "1"
* },
* {
* "key": "two",
* "value": "2"
* },
* {
* "key": "two",
* "value": "2"
* }
*
* ]
*
* }
*/
//因为操作系统的问题这里会对“进行转义 其实就是上面的json数据
String jsonString ="{\n" +
"\t\"name\": \"海洋\",\n" +
"\t\"age\": 23,\n" +
"\t\"address\": \"河南\",\n" +
"\t\"flag\": false,\n" +
"\t\"mylist\": [{\n" +
"\t\t\t\"key\": \"one\",\n" +
"\t\t\t\"value\": \"1\"\n" +
"\t\t},\n" +
"\t\t{\n" +
"\t\t\t\"key\": \"two\",\n" +
"\t\t\t\"value\": \"2\"\n" +
"\t\t},\n" +
"\t\t{\n" +
"\t\t\t\"key\": \"two\",\n" +
"\t\t\t\"value\": \"2\"\n" +
"\t\t}\n" +
"\n" +
"\t]\n" +
"\n" +
"}" ;
Button button = findViewById(R.id.MyParse);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//将json字符串,转为 JSONObject 对象
try {
JSONObject jsonObject = new JSONObject(jsonString);
String name = jsonObject.getString("name"); //通过键得到name的值
Log.i("json","name的值是:"+name);
String age = jsonObject.getString("age"); //通过键得到age的值
Log.i("json","age的值是:"+age);
String address = jsonObject.getString("address"); //通过键得到address的值
Log.i("json","address的值是"+address);
String falage = jsonObject.getString("flag"); //通过键得到flag的值
Log.i("json","flag的值是"+falage);
String list = jsonObject.getString("mylist"); //通过键得到list的值
Log.i("json","mylist的值是"+list);
} catch (JSONException e) {
e.printStackTrace();
}
Log.i("json",jsonString);
}
});
}
}
我们可以看看输出的结果,通过JSONObject的getString方法就拿到了json字符串里面的饿值
现在我们需要注意一下 , mylist的值是一个 [ xxxxx ] ,这样的格式,说明这个字符串是一个json数组字符串,那么我们就可以吧这个数组字符转化为json’数组了
我们把[{“key”:”one”,”value”:”1”},{“key”:”two”,”value”:”2”},{“key”:”two”,”value”:”2”}] 这个json字符串数组,转为json数组就可以遍历这个json数组了。
我们在程序里面点击按钮将[{“key”:”one”,”value”:”1”},{“key”:”two”,”value”:”2”},{“key”:”two”,”value”:”2”}] 转为json数组,然后遍历一下数据
代码
public class MainActivity3 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
/**
* 定义一个json
* {
* "name": "海洋",
* "age": 23,
* "address": "河南",
* "flag": false,
* "mylist": [{
* "key": "one",
* "value": "1"
* },
* {
* "key": "two",
* "value": "2"
* },
* {
* "key": "two",
* "value": "2"
* }
*
* ]
*
* }
*/
//因为操作系统的问题这里会对“进行转义 其实就是上面的json数据
String jsonString ="{\n" +
"\t\"name\": \"海洋\",\n" +
"\t\"age\": 23,\n" +
"\t\"address\": \"河南\",\n" +
"\t\"flag\": false,\n" +
"\t\"mylist\": [{\n" +
"\t\t\t\"key\": \"one\",\n" +
"\t\t\t\"value\": \"1\"\n" +
"\t\t},\n" +
"\t\t{\n" +
"\t\t\t\"key\": \"two\",\n" +
"\t\t\t\"value\": \"2\"\n" +
"\t\t},\n" +
"\t\t{\n" +
"\t\t\t\"key\": \"two\",\n" +
"\t\t\t\"value\": \"2\"\n" +
"\t\t}\n" +
"\n" +
"\t]\n" +
"\n" +
"}" ;
Button button = findViewById(R.id.MyParse);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//将json字符串,转为 JSONObject 对象
try {
JSONObject jsonObject = new JSONObject(jsonString);
String name = jsonObject.getString("name"); //通过键得到json的值
Log.i("json","name的值是------"+name);
String age = jsonObject.getString("age"); //通过键得到json的值
Log.i("json","age的值是-----"+age);
String address = jsonObject.getString("address"); //通过键得到json的值
Log.i("json","address的值是-----"+address);
String falage = jsonObject.getString("flag"); //通过键得到json的值
Log.i("json","flag的值是------"+falage);
String list = jsonObject.getString("mylist"); //通过键得到json的值
Log.i("json","mylist的值是-----"+list);
//这个list数据就是 [{"key":"one","value":"1"},{"key":"two","value":"2"},{"key":"two","value":"2"}]
//可以看到这是一个json数组的字符串,然后我们就可以将这个json数组字符串转为json数组了。
//-----json数组的处理---------------------------------------------------------------
Log.i("json", "json数组遍历");
//我们开始将json数组字符串转为 json数组
JSONArray jsonArray = new JSONArray(list);
for (int i = 0 ; i< jsonArray.length() ; i++){
Log.i("json",jsonArray.get(i).toString());
/* 打印出来的结果就是
{"key":"one","value":"1"}
{"key":"two","value":"2"}
{"key":"two","value":"2"}
*/
//我们可以看到,json数组里面的每一项都是一个 json字符串 那么我们还可以对这个json字符串进行进一步的解析
//json字符串转为 json对象
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
//我们就可以通过键得到里面的值了
Log.i("json", "key的值是"+jsonObject1.getString("key"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
看到控制台里面的打印数据,可以看到json里面里面的数据都已经被解析出来的,我们拿到这些解析以后的数据就可以将数据,封装成为我们想要的对象了。
2.1 JSONObject 对象小结
对于JSONObject 对象看到 { xxxx } 这样大括号开始的时候,先用 JSONObject 对象处理
看到 [ xxxx ] 这样用中括号包裹单的数据,先用 JSONArry 处理
3 GSON 解析json数据
安卓里面是使用GSON的时候需要先在 app/build.gradle,dependencies 里面添加下面的包
我这里使用GSON解析 这格json数组字符串,因为 GSON可以自动的将一段,json字符串映射成为一个对象
比如这里我们就可以创建一个MyApp实体类 里面定义三个字段是 id name version , GSON就可将这个
{“id”: “5”,”name”: “five”,”version”: “5.5”} 映射成为一个MyApp对象
首先我们先准备一个 json字符串,可以看到这是一个json数组字符串。
[{
"id": "5",
"name": "five",
"version": "5.5"
},
{
"id": "6",
"name": "six",
"version": "6.6"
},
{
"id": "7",
"name": "seven",
"version": "7.7"
}
]
我们要将每一个{“id”: “5”,”name”: “five”,”version”: “5.5”} 映射成为一个MyApp对象
我们要先创建 MyApp这个实体类
package com.example.httptest;
public class MyApp {
private String id ;
private String name ;
private String version ;
public MyApp() {
}
public MyApp(String id, String name, String version) {
this.id = id;
this.name = name;
this.version = version;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
直接上代码
public class MainActivity4 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
Button button = findViewById(R.id.ParseWithGSon);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*
一个json字符串 我们可以看到这是一个json数组字符串
我这里使用GSON解析 这格json数组字符串,因为 GSON可以自动的将一段,json字符串映射成为一个对象
比如这里我们就可以创建一个MyApp实体类 里面定义三个字段是 id name version , GSON就可将这个
{"id": "5","name": "five","version": "5.5"} 映射成为一个MyApp对象
需要注意的是,在映射的时候, 我们的对象 里面如果只有 id name两个属性的话 , 会自动将{"id": "5","name": "five","version": "5.5"}
里面的两个对象赋值给我们的MyApp对象
[{
"id": "5",
"name": "five",
"version": "5.5"
},
{
"id": "6",
"name": "six",
"version": "6.6"
},
{
"id": "7",
"name": "seven",
"version": "7.7"
}
]
*/
//我们可以很明显的看到这是一个 json数组字符串
String json = "[{\n" +
" \"id\": \"5\",\n" +
" \"name\": \"five\",\n" +
" \"version\": \"5.5\"\n" +
" },\n" +
" {\n" +
" \"id\": \"6\",\n" +
" \"name\": \"six\",\n" +
" \"version\": \"6.6\"\n" +
" },\n" +
" {\n" +
" \"id\": \"7\",\n" +
" \"name\": \"seven\",\n" +
" \"version\": \"7.7\"\n" +
" }\n" +
" ]";
//开始解析
Gson gson = new Gson();
//将JSON数组字符串,自动的转为了 MyList 对象的集合
List<MyApp> appList = gson.fromJson(json,new TypeToken<List<MyApp>>(){}.getType());
for (MyApp myApp : appList){
Log.i("json", myApp.getId());
Log.i("json", myApp.getName());
Log.i("json", myApp.getVersion());
}
}
});
}
}
从打印数据来看已经封装成为了 MyApp对象