在Android中定位json的万能方法
{
"errno": 0,
"data": {
"count": 1,
"datastreams": [
{
"datapoints": [
{
"at": "2020-10-21 11:59:19.122",
"value": false
}
],
"id": "3311_2_5850"
}
]
},
"error": "succ"
}
这个是我们今天需要定位到的东西,这里可以看出它的结构非常复杂,在字典里面嵌套了队列,又在队列里面嵌套字典,网上很多方法都是只是教你怎么定位到字典的某个值而已,很少有定位字典再定位队列再定位字典,再定位队列这种恶心的结构,所以今天特意写这篇博客,学完这个方法后,今晚在java或者Android中遇到任何json形式都可以精准定位到你想定位到的位置
首先先获取或创建json数据,这里我采用的是创建
String json
= "
{
"errno": 0,
"data": {
"count": 1,
"datastreams": [
{
"datapoints": [
{
"at": "2020-10-21 11:59:19.122",
"value": false
}
],
"id": "3311_2_5850"
}
]
},
"error": "succ"
}"
;
我们再看,要怎么一步步解析我们的json对象,先创建一个防错机制,输出一个结果
try {
JSONObject object
= new JSONObject(json
);
System
.out
.println(object
);
} catch (JSONException e
) {
e
.printStackTrace();
}
{"errno":0,"data":{"count":1,"datastreams":[{"datapoints":[{"at":"2020-10-21 11:59:19.122","value":false}],"id":"3311_2_5850"}]},"error":"succ"}
这是我们的结果,然后开始我们的定位工作,先进入我们的第一层位置定位到我们的data的值
try {
JSONObject object
= new JSONObject(json
);
String data
= object
.getString("data");
System
.out
.println(data
);
} catch (JSONException e
) {
e
.printStackTrace();
}
{"count":1,"datastreams":[{"datapoints":[{"at":"2020-10-21 11:59:19.122","value":false}],"id":"3311_2_5850"}]}
再定位到datastreams的值
try {
JSONObject object
= new JSONObject(json
);
String data
= object
.getString("data");
JSONObject datastreams
= new JSONObject(data
);
String da
= datastreams
.getString("datastreams");
System
.out
.println(da
);
} catch (JSONException e
) {
e
.printStackTrace();
}
[{"datapoints":[{"at":"2020-10-21 11:59:19.122","value":false}],"id":"3311_2_5850"}]
再从队列里面定位到datapoints的值
try {
JSONObject object
= new JSONObject(json
);
String data
= object
.getString("data");
JSONObject datastreams
= new JSONObject(data
);
String da
= datastreams
.getString("datastreams");
JSONArray jsonArray
= new JSONArray(da
);
for (int i
= 0; i
< jsonArray
.length(); i
++)
{
JSONObject jsonObject
= jsonArray
.getJSONObject(i
);
System
.out
.println(jsonObject
);
}
} catch (JSONException e
) {
e
.printStackTrace();
}
{"datapoints":[{"at":"2020-10-21 11:59:19.122","value":false}],"id":"3311_2_5850"}
再定位到datapoints的值
try {
JSONObject object
= new JSONObject(json
);
String data
= object
.getString("data");
JSONObject datastreams
= new JSONObject(data
);
String da
= datastreams
.getString("datastreams");
JSONArray jsonArray
= new JSONArray(da
);
for (int i
= 0; i
< jsonArray
.length(); i
++)
{
JSONObject jsonObject
= jsonArray
.getJSONObject(i
);
System
.out
.println(jsonObject
);
if (jsonObject
!= null
) {
String datapoints
= jsonObject
.optString("datapoints");
System
.out
.println(datapoints
);
JSONArray jsonArray1
= new JSONArray(datapoints
);
System
.out
.println(jsonArray1
);
}
} catch (JSONException e
) {
e
.printStackTrace();
}
{"datapoints":[{"at":"2020-10-21 11:59:19.122","value":false}],"id":"3311_2_5850"}
[{"at":"2020-10-21 11:59:19.122","value":false}]
最后从这个列表里面定位到我们想要的数据,例如vlaue这个的值
try {
JSONObject object
= new JSONObject(json
);
String data
= object
.getString("data");
JSONObject datastreams
= new JSONObject(data
);
String da
= datastreams
.getString("datastreams");
JSONArray jsonArray
= new JSONArray(da
);
for (int i
= 0; i
< jsonArray
.length(); i
++)
{
JSONObject jsonObject
= jsonArray
.getJSONObject(i
);
if (jsonObject
!= null
) {
String datapoints
= jsonObject
.optString("datapoints");
JSONArray jsonArray1
= new JSONArray(datapoints
);
System
.out
.println(jsonArray1
);
for (int j
= 0; i
< jsonArray1
.length(); j
++){
JSONObject jsonObject1
= jsonArray1
.getJSONObject(j
);
System
.out
.println(jsonObject1
);
if (jsonObject1
!= null
){
String val
= jsonObject1
.optString("value");
System
.out
.println(val
);
va
= val
;
}
}
}
}
} catch (JSONException e
) {
e
.printStackTrace();
}
[{"at":"2020-10-21 11:59:19.122","value":false}]
{"at":"2020-10-21 11:59:19.122","value":false}
false
最后还需要在Android-app-manifests-AndroidManifest.xml文件里面添加一行
android:usesCleartextTraffic="true" 这样才可以显示最后的结果
小结:通过上面的方法可以用Android将任意形式的json值给定位出来,虽然说写出来会比较麻烦,大佬可以无视,不过对于新手来说还是挺友好的,毕竟只要能解决问题那就是好方法