首先我们访问某一个服务器,或者调用第三方的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 {@Overrideprotected 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() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main4);Button button = findViewById(R.id.ParseWithGSon);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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对象
