在Android中定位json的万能方法

it2024-10-08  39

在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 { //将我们的字符串转化为json形式 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 { //将我们的字符串转化为json形式 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 { //将我们的字符串转化为json形式 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 { //将我们的字符串转化为json形式 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 { //将我们的字符串转化为json形式 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 { //将我们的字符串转化为json形式 JSONObject object = new JSONObject(json); //获取data值 String data = object.getString("data"); //将data值转化为json JSONObject datastreams = new JSONObject(data); //获取datastreams值 String da = datastreams.getString("datastreams"); //将获取到的da值转化为json的队列形式 JSONArray jsonArray = new JSONArray(da); //将[]去掉 for (int i = 0; i < jsonArray.length(); i++) { //打印队列里面的全部值 JSONObject jsonObject = jsonArray.getJSONObject(i); //判断,当jsonObject不为空值的时候执行下一步操作 if (jsonObject != null) { //获取到datapoints值 String datapoints = jsonObject.optString("datapoints"); //将获取到datapoints值转化为json的队列形式 JSONArray jsonArray1 = new JSONArray(datapoints); System.out.println(jsonArray1); //将[]去掉 for (int j = 0; i < jsonArray1.length(); j++){ //将[]里面的值全部转化为json形式 JSONObject jsonObject1 = jsonArray1.getJSONObject(j); System.out.println(jsonObject1); if (jsonObject1 != null){ //将value打印出来 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值给定位出来,虽然说写出来会比较麻烦,大佬可以无视,不过对于新手来说还是挺友好的,毕竟只要能解决问题那就是好方法

最新回复(0)