【问题标题】:How to fetch json inside json inside another json?如何在另一个json中的json中获取json?
【发布时间】:2020-06-12 21:08:27
【问题描述】:

我是 android 和 json 的新手。我想实现一些逻辑,我可以从 sub1 从另一个 json 中的 json 中的 json 获取数据。 有什么方法可以获取这些数据?

这就是我的 json 文件的样子。

{
  "Aeronautical": [],
  "Automobile": [],
  "Civil": [],
  "Computer": [
    {
      "sub1": [
        {
          "id": "1",
          "name": "name1",
          "year": "2019",
          "url": "some_url"
        },
        {
          "id": "2",
          "name": "Name 2",
          "year": "2018",
          "url": "some url"
        },
        {
          "id": "3",
          "name": "Name 4",
          "year": "2018",
          "url": "some url"
        }
      ]
    }
  ]
}

【问题讨论】:

  • 您是否查看过正确的 json 解析,例如通过 gson?
  • @JakobF 没有。我是新来的。
  • 为了澄清一些术语,JSON 是一种用于在机器和应用程序之间传输数据的字符格式。所以说“json inside json inside another json”没有多大意义,因为 JSON 本身不是语法结构。相反,它指定了几种数据类型的语法:数字和字符串的简单类型以及数组和对象的聚合类型。您在这里拥有的是一个对象,该对象又嵌套了数组和其他对象。
  • 话虽如此,您需要一个解析库来帮助您从这个 JSON 对象中获取所需的数据,Greg Moens 的回答应该为您指明正确的方向。如需进一步帮助,请谷歌“JSON android”以查找更多教程和文档。

标签: java android json android-studio android-json


【解决方案1】:

sub1 在另一个数组中,所以首先你应该从计算机数组中获取数据

   JSONObject obj = null;
        try {
            obj = new JSONObject(json);

        JSONArray arr = obj.getJSONArray("Computer");

        for (int i = 0; i < arr.length(); i++)
        {
            JSONObject obj_computers = arr.getJSONObject(i);
            JSONArray sub1 = obj_computers.getJSONArray("sub1");

            for (int j = 0; j < sub1 .length(); j++)
            {
                JSONObject sub1_data = sub1.getJSONObject(j);
                Log.i("test" ,sub1_data.toString());
            }
        }
        } catch (JSONException e) {
            e.printStackTrace();
        }

【讨论】:

    【解决方案2】:

    Android SDK 包含 org.json 库。您可以使用 JSONObject 类。

    String jsonString = /* obtain some JSON however you need to*/;
    JSONObject root = new JSONObject(jsonString);
    JSONObject sub1 = root.getJSONObject("sub1");
    

    我省略了异常处理,但这是基本思想。

    【讨论】:

    • 我尝试了我的逻辑。这是代码:try { JSONObject jsonDept = response.getJSONObject(dept); JSONObject jsonSub = jsonDept.getJSONObject(sub); JSONArray jsonArray1 = jsonSub.getJSONArray(sub); for (int i=0;i&lt;jsonArray1.length();i++){ login to get data from jsonArray}。但它给了我一个这样的例外:at org.json.JSON.typeMismatch(JSON.java:101) W/System.err: at org.json.JSONObject.getJSONObject(JSONObject.java:616)
    • 看起来您正试图从不是 JSONObject 的属性中获取 JSONObject。变量“sub”包含什么?因为您将其传递给 2 个不同的 getXXX() 方法。
    • sub 基本上是一个主题,因此根据用户选择的主题,我只能获取该主题的数据。例如,如果我选择网络安全(sub1),我应该只从该主题(sub1)获取数据。
    • 它也给了我这一行:at Computer of type org.json.JSONArray cannot be converted to JSONObject.
    • 因此,您要求的数据类型与实际存在的数据类型不匹配。如果将 'sub' 的相同值传递给两个不同的 getXXX() 方法,那么其中一个将引发异常是有意义的。 JSON 属性不能同时是子对象和数组。您可能想要使用 optXXX() 方法而不是 getXXX() 方法。如果您不确定用户将要做出的数据或选择,opt 方法不会抛出异常会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多