首先我们访问某一个服务器,或者调用第三方的API 之后会返回一些json数据,我们就要使用android将这些json数据解析出来,然我们更加直观的看懂服务器的数据。

比如下面这一串json数据。
有时候我们得到的json数据格式并不是这么规范,我们就可以到bejsonjson在线格式化这个网站进行json数据的格式化。
或者验证你自己写的一个json数据是否合法。

  1. {
  2. "data": {
  3. "list": [
  4. {
  5. "access_mode": "读写",
  6. "data_type": "int32",
  7. "description": "",
  8. "expect_value": "",
  9. "identifier": "Alerm",
  10. "name": "报警",
  11. "time": "0",
  12. "value": ""
  13. },
  14. {
  15. "access_mode": "只读",
  16. "data_type": "struct",
  17. "description": "",
  18. "expect_value": "",
  19. "identifier": "GeoLocation",
  20. "name": "地理位置",
  21. "time": "1648559138231",
  22. "value": "{\"CoordinateSystem\":1,\"Latitude\":52.21,\"Longitude\":100.45,\"Altitude\":8000}"
  23. }
  24. ]
  25. },
  26. "requestId": "4cac35408273446099778a24f35fed95",
  27. "success": true
  28. }

我们也可以参考这个博客。https://www.cnblogs.com/android-deli/p/10167395.html

1 json的一些规则

image.png

我们可以当看到在一开始的json字符串里面 是以 { xxxxx xxxxx } 开始的,说明这个是一个json的字符串

还有一些是以 [ xxxx ] 说明这个直接就是一个json数组。

2 JSONObject 解析json

这个是安卓官方提供的一个 对象,用来解析json数据, 不需要导包

这里主要就是用到了两个对象,一个对象是

JSONObject 对象,用来将 json字符串转化为 json对象,这样我们就可以getString(“key”)通过键得到值

JSONArray 用于将json数组字符串转为 一个json数组,这样我们就可以遍历数组了。

比如说:我们吧这个json字符转为先转为JSONObject对象,然后我们就可以通过get

  1. {
  2. "name": "海洋",
  3. "age": 23,
  4. "address": "河南",
  5. "flag": false,
  6. "mylist": [{
  7. "key": "one",
  8. "value": "1"
  9. },
  10. {
  11. "key": "two",
  12. "value": "2"
  13. },
  14. {
  15. "key": "two",
  16. "value": "2"
  17. }
  18. ]
  19. }

按钮的点击事件

  1. public class MainActivity3 extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main3);
  6. /**
  7. * 定义一个json
  8. * {
  9. * "name": "海洋",
  10. * "age": 23,
  11. * "address": "河南",
  12. * "flag": false,
  13. * "mylist": [{
  14. * "key": "one",
  15. * "value": "1"
  16. * },
  17. * {
  18. * "key": "two",
  19. * "value": "2"
  20. * },
  21. * {
  22. * "key": "two",
  23. * "value": "2"
  24. * }
  25. *
  26. * ]
  27. *
  28. * }
  29. */
  30. //因为操作系统的问题这里会对“进行转义 其实就是上面的json数据
  31. String jsonString ="{\n" +
  32. "\t\"name\": \"海洋\",\n" +
  33. "\t\"age\": 23,\n" +
  34. "\t\"address\": \"河南\",\n" +
  35. "\t\"flag\": false,\n" +
  36. "\t\"mylist\": [{\n" +
  37. "\t\t\t\"key\": \"one\",\n" +
  38. "\t\t\t\"value\": \"1\"\n" +
  39. "\t\t},\n" +
  40. "\t\t{\n" +
  41. "\t\t\t\"key\": \"two\",\n" +
  42. "\t\t\t\"value\": \"2\"\n" +
  43. "\t\t},\n" +
  44. "\t\t{\n" +
  45. "\t\t\t\"key\": \"two\",\n" +
  46. "\t\t\t\"value\": \"2\"\n" +
  47. "\t\t}\n" +
  48. "\n" +
  49. "\t]\n" +
  50. "\n" +
  51. "}" ;
  52. Button button = findViewById(R.id.MyParse);
  53. button.setOnClickListener(new View.OnClickListener() {
  54. @Override
  55. public void onClick(View view) {
  56. //将json字符串,转为 JSONObject 对象
  57. try {
  58. JSONObject jsonObject = new JSONObject(jsonString);
  59. String name = jsonObject.getString("name"); //通过键得到name的值
  60. Log.i("json","name的值是:"+name);
  61. String age = jsonObject.getString("age"); //通过键得到age的值
  62. Log.i("json","age的值是:"+age);
  63. String address = jsonObject.getString("address"); //通过键得到address的值
  64. Log.i("json","address的值是"+address);
  65. String falage = jsonObject.getString("flag"); //通过键得到flag的值
  66. Log.i("json","flag的值是"+falage);
  67. String list = jsonObject.getString("mylist"); //通过键得到list的值
  68. Log.i("json","mylist的值是"+list);
  69. } catch (JSONException e) {
  70. e.printStackTrace();
  71. }
  72. Log.i("json",jsonString);
  73. }
  74. });
  75. }
  76. }

我们可以看看输出的结果,通过JSONObject的getString方法就拿到了json字符串里面的饿值
image.png

现在我们需要注意一下 , 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数组,然后遍历一下数据

代码

  1. public class MainActivity3 extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main3);
  6. /**
  7. * 定义一个json
  8. * {
  9. * "name": "海洋",
  10. * "age": 23,
  11. * "address": "河南",
  12. * "flag": false,
  13. * "mylist": [{
  14. * "key": "one",
  15. * "value": "1"
  16. * },
  17. * {
  18. * "key": "two",
  19. * "value": "2"
  20. * },
  21. * {
  22. * "key": "two",
  23. * "value": "2"
  24. * }
  25. *
  26. * ]
  27. *
  28. * }
  29. */
  30. //因为操作系统的问题这里会对“进行转义 其实就是上面的json数据
  31. String jsonString ="{\n" +
  32. "\t\"name\": \"海洋\",\n" +
  33. "\t\"age\": 23,\n" +
  34. "\t\"address\": \"河南\",\n" +
  35. "\t\"flag\": false,\n" +
  36. "\t\"mylist\": [{\n" +
  37. "\t\t\t\"key\": \"one\",\n" +
  38. "\t\t\t\"value\": \"1\"\n" +
  39. "\t\t},\n" +
  40. "\t\t{\n" +
  41. "\t\t\t\"key\": \"two\",\n" +
  42. "\t\t\t\"value\": \"2\"\n" +
  43. "\t\t},\n" +
  44. "\t\t{\n" +
  45. "\t\t\t\"key\": \"two\",\n" +
  46. "\t\t\t\"value\": \"2\"\n" +
  47. "\t\t}\n" +
  48. "\n" +
  49. "\t]\n" +
  50. "\n" +
  51. "}" ;
  52. Button button = findViewById(R.id.MyParse);
  53. button.setOnClickListener(new View.OnClickListener() {
  54. @Override
  55. public void onClick(View view) {
  56. //将json字符串,转为 JSONObject 对象
  57. try {
  58. JSONObject jsonObject = new JSONObject(jsonString);
  59. String name = jsonObject.getString("name"); //通过键得到json的值
  60. Log.i("json","name的值是------"+name);
  61. String age = jsonObject.getString("age"); //通过键得到json的值
  62. Log.i("json","age的值是-----"+age);
  63. String address = jsonObject.getString("address"); //通过键得到json的值
  64. Log.i("json","address的值是-----"+address);
  65. String falage = jsonObject.getString("flag"); //通过键得到json的值
  66. Log.i("json","flag的值是------"+falage);
  67. String list = jsonObject.getString("mylist"); //通过键得到json的值
  68. Log.i("json","mylist的值是-----"+list);
  69. //这个list数据就是 [{"key":"one","value":"1"},{"key":"two","value":"2"},{"key":"two","value":"2"}]
  70. //可以看到这是一个json数组的字符串,然后我们就可以将这个json数组字符串转为json数组了。
  71. //-----json数组的处理---------------------------------------------------------------
  72. Log.i("json", "json数组遍历");
  73. //我们开始将json数组字符串转为 json数组
  74. JSONArray jsonArray = new JSONArray(list);
  75. for (int i = 0 ; i< jsonArray.length() ; i++){
  76. Log.i("json",jsonArray.get(i).toString());
  77. /* 打印出来的结果就是
  78. {"key":"one","value":"1"}
  79. {"key":"two","value":"2"}
  80. {"key":"two","value":"2"}
  81. */
  82. //我们可以看到,json数组里面的每一项都是一个 json字符串 那么我们还可以对这个json字符串进行进一步的解析
  83. //json字符串转为 json对象
  84. JSONObject jsonObject1 = jsonArray.getJSONObject(i);
  85. //我们就可以通过键得到里面的值了
  86. Log.i("json", "key的值是"+jsonObject1.getString("key"));
  87. }
  88. } catch (JSONException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. });
  93. }
  94. }

image.png
看到控制台里面的打印数据,可以看到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数组字符串。

  1. [{
  2. "id": "5",
  3. "name": "five",
  4. "version": "5.5"
  5. },
  6. {
  7. "id": "6",
  8. "name": "six",
  9. "version": "6.6"
  10. },
  11. {
  12. "id": "7",
  13. "name": "seven",
  14. "version": "7.7"
  15. }
  16. ]

我们要将每一个{“id”: “5”,”name”: “five”,”version”: “5.5”} 映射成为一个MyApp对象
我们要先创建 MyApp这个实体类

  1. package com.example.httptest;
  2. public class MyApp {
  3. private String id ;
  4. private String name ;
  5. private String version ;
  6. public MyApp() {
  7. }
  8. public MyApp(String id, String name, String version) {
  9. this.id = id;
  10. this.name = name;
  11. this.version = version;
  12. }
  13. public String getId() {
  14. return id;
  15. }
  16. public void setId(String id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public String getVersion() {
  26. return version;
  27. }
  28. public void setVersion(String version) {
  29. this.version = version;
  30. }
  31. }

直接上代码

  1. public class MainActivity4 extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main4);
  6. Button button = findViewById(R.id.ParseWithGSon);
  7. button.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View view) {
  10. /*
  11. 一个json字符串 我们可以看到这是一个json数组字符串
  12. 我这里使用GSON解析 这格json数组字符串,因为 GSON可以自动的将一段,json字符串映射成为一个对象
  13. 比如这里我们就可以创建一个MyApp实体类 里面定义三个字段是 id name version , GSON就可将这个
  14. {"id": "5","name": "five","version": "5.5"} 映射成为一个MyApp对象
  15. 需要注意的是,在映射的时候, 我们的对象 里面如果只有 id name两个属性的话 , 会自动将{"id": "5","name": "five","version": "5.5"}
  16. 里面的两个对象赋值给我们的MyApp对象
  17. [{
  18. "id": "5",
  19. "name": "five",
  20. "version": "5.5"
  21. },
  22. {
  23. "id": "6",
  24. "name": "six",
  25. "version": "6.6"
  26. },
  27. {
  28. "id": "7",
  29. "name": "seven",
  30. "version": "7.7"
  31. }
  32. ]
  33. */
  34. //我们可以很明显的看到这是一个 json数组字符串
  35. String json = "[{\n" +
  36. " \"id\": \"5\",\n" +
  37. " \"name\": \"five\",\n" +
  38. " \"version\": \"5.5\"\n" +
  39. " },\n" +
  40. " {\n" +
  41. " \"id\": \"6\",\n" +
  42. " \"name\": \"six\",\n" +
  43. " \"version\": \"6.6\"\n" +
  44. " },\n" +
  45. " {\n" +
  46. " \"id\": \"7\",\n" +
  47. " \"name\": \"seven\",\n" +
  48. " \"version\": \"7.7\"\n" +
  49. " }\n" +
  50. " ]";
  51. //开始解析
  52. Gson gson = new Gson();
  53. //将JSON数组字符串,自动的转为了 MyList 对象的集合
  54. List<MyApp> appList = gson.fromJson(json,new TypeToken<List<MyApp>>(){}.getType());
  55. for (MyApp myApp : appList){
  56. Log.i("json", myApp.getId());
  57. Log.i("json", myApp.getName());
  58. Log.i("json", myApp.getVersion());
  59. }
  60. }
  61. });
  62. }
  63. }

image.png

从打印数据来看已经封装成为了 MyApp对象