【问题标题】:Retrieving nested arrays values with JSON Java使用 JSON Java 检索嵌套数组值
【发布时间】:2016-11-29 05:15:25
【问题描述】:

我正在努力从格式如下的 JSON 文件中检索一些值:

{
  "search": {
    "entry": [
      {
        "found": "identity=9454532,l=big,ton=grand,k=molvi",
        "attribute": [
          {
            "name": "firstname",
            "value": [
              "Lucas"
            ]
          },
          {
            "name": "lastname",
            "value": [
              "Brandon"
            ]
          }
        ]
      }
    ],
    "return": {
      "code": 0,
      "message": "Success",
      "count": 1
    }
  }
}

我尝试了不同的方法(json、gson、jayway-JsonPath),但我无法从“属性”数组中获取值,只能从第一个数组中获取值。我不知道如何指定“属性”是 JSONArray 而不是 JSONObject 或如何设置正确的路径。 这是我正在使用的最后一个代码,它在找到一个数组时停止:

public void String nameObtain (String email) throws IOException{

String link = "http://jsonfile/" + email;

    JSONObject json = readJsonFromUrl(link);        
    JSONObject rootObject = json.getJSONObject("search");
    JSONArray firstArray = rootObject.getJSONArray("entry");

for (int i = 0, size = firstArray.length(); i < size; i++) {
    JSONObject objectInArray = firstArray.getJSONObject(i);

    String[] elementNames = JSONObject.getNames(objectInArray);
    System.out.printf("%d ELEMENTS IN CURRENT OBJECT:\n", elementNames.length);
    for (String elementName : elementNames) {
        String value = objectInArray.getString(elementName);
        System.out.printf("name=%s, value=%s\n", elementName, value);
    }

}

}

我想做的是获得 Lucas 或 Brandon 的值。任何帮助都感激不尽!

【问题讨论】:

  • 所以你想得到一个 JSON 数组但使用的是getString?如果您不想指定期望的类型,只需使用简单的get 方法即可。
  • 或者使用 getJSONArray 来表示你知道的 JSON 数组。
  • 你能取回“entry”数组的值吗?如果是这样,那么它应该类似于“属性”数组。 getJSONArray 方法就是您所需要的。从它返回的任何内容都可以视为 JSONObject 并进行迭代。
  • @SotiriosDelimanolis 如果我只是尝试使用 json.get("firstname");找不到对象。我无法实现的是设置到达该数组的正确路径。
  • 没有正确的路径。您可以单独获取每个成员,直到找到您要查找的嵌套最多的成员。

标签: java arrays json


【解决方案1】:

使用的库:

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

检查下面的代码并逐步解析

    JSONObject search = (JSONObject) jsonObject.get("search");//1
    JSONArray entry = (JSONArray) search.get("entry");//2
    for (int i = 0; i < entry.size(); i++) {
        JSONObject jsonObject1 = (JSONObject) entry.get(i);//3
        JSONArray jsonarray1 = (JSONArray) jsonObject1.get("attribute");//4
        for (int j = 0; j < jsonarray1.size(); j++) {
            System.out.println(((JSONObject) jsonarray1.get(j)).get(
                    "value").toString());//5

        }

    }

它将逐步给出提到的值:

1) {"entry":[{"found":"identity=9454532,l=big,ton=grand,k=molvi","attribute":[{"name":"firstname","value ":["Lucas"]},{"name":"lastname","value":["Brandon"]}]}],"return":{"code":0,"count":1," message":"成功"}}

2) [{"found":"identity=9454532,l=big,ton=grand,k=molvi","attribute":[{"name":"firstname","value":["Lucas "]},{"name":"lastname","value":["Brandon"]}]}]

3) {"found":"identity=9454532,l=big,ton=grand,k=molvi","attribute":[{"name":"firstname","value":["Lucas" ]},{"name":"lastname","value":["Brandon"]}]}

4) [{"name":"firstname","value":["Lucas"]},{"name":"lastname","value":["Brandon"]}]

5) ["Lucas"] 和 ["Brandon"]

所以基本上你必须分别处理 JSONObject 和 JSONArray 并进行相应的解析。

【讨论】:

  • 谢谢@Rishal,终于有点光了!!
  • 我有同样的问题意味着我需要更新内部值,问题是将值列表直接更新到内部对象,在那个位置是 0,1,2,0,1,3, 4,5,0 像这样,如果我试图更新该循环中所有值的arraylist 相同的数据粘贴该位置@Rishal
  • 带有详细信息的问题将很有帮助,例如 ypu 到底想做什么以及您不能做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多