【问题标题】:Retrieving values from nested JSON Object从嵌套的 JSON 对象中检索值
【发布时间】:2014-01-03 08:53:32
【问题描述】:

我有想要解析的 JSON 文件。 JSON 文件(“myfile”)的格式如下:

{
    "LanguageLevels": {
        "1": "Początkujący",
        "2": "ŚrednioZaawansowany",
        "3": "Zaawansowany",
        "4": "Ekspert"
    }
}

我想从语言级别检索键 2 的值 (ŚrednioZaawansowany)。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonSimpleExample {
public static void main(String[] args) {

JSONParser parser = new JSONParser();

try {

    Object obj = parser.parse(new FileReader("myfile"); 
    JSONObject jsonObject = (JSONObject) obj;
    JSONObject jsonChildObject = (JSONObject)jsonObject.get("LanguageLevels");

接下来要做什么?我如何迭代它?

【问题讨论】:

  • 我建议阅读官方文档,如果有的话,看看他们的例子。

标签: java json parsing nested


【解决方案1】:

也许您没有使用最新版本的 JSON for Java 库。

json-simple很久没更新了,JSON-Java2个月前更新了。

JSON-Java 可以在 GitHub 上找到,这里是它的 repo 的链接:https://github.com/douglascrockford/JSON-java

切换库后,可以参考我下面的示例代码:

public static void main(String[] args) {
    String JSON = "{\"LanguageLevels\":{\"1\":\"Pocz\\u0105tkuj\\u0105cy\",\"2\":\"\\u015arednioZaawansowany\",\"3\":\"Zaawansowany\",\"4\":\"Ekspert\"}}\n";

    JSONObject jsonObject = new JSONObject(JSON);
    JSONObject getSth = jsonObject.getJSONObject("LanguageLevels");
    Object level = getSth.get("2");

    System.out.println(level);
}

由于JSON-Java 是开源的,您可以阅读代码及其文档,它们将引导您完成。

希望对你有帮助。

【讨论】:

  • 在 jsonObject Eclipse 的构造函数中打印此错误:构造函数 JSONObject(String) 未定义
  • @m.aibin 请注意,您从 GitHub 下载的所有文件都没有放在正确的包中。您必须创建一个名为 org.json 的新包,然后将所有 java 文件拖放到该包中。你摇滚!
  • @m.aibin 另外,请注意,它不是嵌套的 JSON 数组,而是嵌套的 JSON 对象。您最好更改此问题的标题,这可能会产生误导。
  • 是的,我使用了错误的包 :) 还有一个问题 - 是否可以从 GitHub 获取此包作为 Maven 依赖项?现在我已经将它作为一个包与我的其他类一起编译
  • 看看这个:mvnrepository.com/artifact/org.json/json。我连接maven站点的网速极低,所以不能试一试。但这应该适合您的需要! ;-)
【解决方案2】:

您必须逐步迭代到嵌套的 JSON。

例如从 Google 地理编码 api 收到的 JSON

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Bhopal",
               "short_name" : "Bhopal",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Bhopal",
               "short_name" : "Bhopal",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Madhya Pradesh",
               "short_name" : "MP",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Bhopal, Madhya Pradesh, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 23.3326697,
                  "lng" : 77.5748062
               },
               "southwest" : {
                  "lat" : 23.0661497,
                  "lng" : 77.2369767
               }
            },
            "location" : {
               "lat" : 23.2599333,
               "lng" : 77.412615
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 23.3326697,
                  "lng" : 77.5748062
               },
               "southwest" : {
                  "lat" : 23.0661497,
                  "lng" : 77.2369767
               }
            }
         },
         "place_id" : "ChIJvY_Wj49CfDkR-NRy1RZXFQI",
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}

我将按照以下给定的方式进行迭代 到“位置”:{ “纬度”:23.2599333, “液化天然气”:77.412615

//接收json对象中的JSON

        JSONObject json = new JSONObject(output.toString());
        JSONArray result = json.getJSONArray("results");
        JSONObject result1 = result.getJSONObject(0);
        JSONObject geometry = result1.getJSONObject("geometry");
        JSONObject locat = geometry.getJSONObject("location");

        //"iterate onto level of location";

        double lat = locat.getDouble("lat");
        double lng = locat.getDouble("lng");

【讨论】:

    【解决方案3】:

    您可以看到JSONObject 扩展了HashMap,因此您可以简单地将其用作HashMap:

    JSONObject jsonChildObject = (JSONObject)jsonObject.get("LanguageLevels");
    for (Map.Entry in jsonChildOBject.entrySet()) {
        System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
    }
    

    【讨论】:

      【解决方案4】:
      JSONArray jsonChildArray = (JSONArray) jsonChildArray.get("LanguageLevels");
          JSONObject secObject = (JSONObject) jsonChildArray.get(1);
      

      我认为这应该可行,但我目前无法对其进行测试..

      【讨论】:

      • 请注意,LanguageLevels 不是 JSON 数组!因为它以大括号而不是左括号开头。所以你这里的代码可能不合适。
      【解决方案5】:

      要查看 Jsonobject 的所有键,请使用 this

          String JSON = "{\"LanguageLevels\":{\"1\":\"Pocz\\u0105tkuj\\u0105cy\",\"2\":\"\\u015arednioZaawansowany\",\"3\":\"Zaawansowany\",\"4\":\"Ekspert\"}}\n";
          JSONObject obj = new JSONObject(JSON);
          Iterator iterator = obj.keys();
          String key = null;
          while (iterator.hasNext()) {
              key = (String) iterator.next();
              System.out.pritnln(key);
          } 
      

      【讨论】:

        【解决方案6】:

        试试这个,可以解析嵌套的JSON

        public static String getJsonValue(String jsonReq, String key) {
                JSONObject json = new JSONObject(jsonReq);
                boolean exists = json.has(key);
                Iterator<?> keys;
                String nextKeys;
                String val = "";
                if (!exists) {
                    keys = json.keys();
                    while (keys.hasNext()) {
                        nextKeys = (String) keys.next();
                        try {
                            if (json.get(nextKeys) instanceof JSONObject) {
                                return getJsonValue(json.getJSONObject(nextKeys).toString(), key);
                            } else if (json.get(nextKeys) instanceof JSONArray) {
                                JSONArray jsonArray = json.getJSONArray(nextKeys);
                                int i = 0;
                                if (i < jsonArray.length()) do {
                                    String jsonArrayString = jsonArray.get(i).toString();
                                    JSONObject innerJson = new JSONObject(jsonArrayString);
                                    return getJsonValue(innerJson.toString(),key);
                                } while (i < jsonArray.length());
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                } else {
                    val = json.get(key).toString();
                }
                return val;
            }
        

        【讨论】:

          猜你喜欢
          • 2017-08-01
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-16
          • 2019-02-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多