3

尝试在 Java 中解析多级 JSON。

具有如下格式的 JSON 输入:

{"object1":["0","1", ..., "n"], 
"objects2":{
"x1":{"name":"y1","type":"z1","values":[19,20,21,22,23,24]}
"x2":{"name":"y2","type":"z2","values":[19,20,21,22,23,24]}
"x3":{"name":"y3","type":"z1","values":[19,20,21,22,23,24]}
"x4":{"name":"y4","type":"z2","values":[19,20,21,22,23,24]}
}

并且需要通过属性之一从 2 中获取所有对象,例如获取 type = z1 的所有对象。

使用 org.json*。

试图做这样的事情:

JSONObject GeneralSettings = new JSONObject(sb.toString()); //receiving and converting JSON;
JSONObject GeneralObjects = GeneralSettings.getJSONObject("objects2");
JSONObject p2;

JSONArray ObjectsAll = new JSONArray();

ObjectsAll = GeneralObjects.toJSONArray(GeneralObjects.names());

for (int i=0; i < GeneralObjects.length(); i++){
    p2 = ObjectsAll.getJSONObject(i);
    switch (p2.getString("type")) {
         case "z1": NewJSONArray1.put(p2); //JSON array that should contain values with type z1. 
         break;
         case "z2": NewJSONArray2.put(p2); //JSON array that should contain values with type z2. 
         default: System.out.println("error");
         break;
        }
    }
}

但是获取空指针异常和整体方法似乎不是那么好。

请告知,有什么方法可以使它更容易,或者,我做错了什么?

4

3 回答 3

2

如果你得到 aNullPointerException很可能你还没有初始化NewJSONArray1NewJSONArray2.

你没有包括他们的声明,但你可能只需要做

NewJSONArray1=new JSONArray();
NewJSONArray2=new JSONArray();

在你的循环之前。

另外:按照惯例,java 变量应该以小写字母开头,例如newJSONArray1

于 2014-07-25T14:06:28.137 回答
0
    public static void main(String[] args) {
    String s =
            "{\"object1\":[\"0\",\"1\",\"n\"]," +
                    "\"objects2\":{" +
                    "\"x1\":{\"name\":\"y1\",\"type\":\"z1\",\"values\":[19,20,21,22,23,24]}," +
                    "\"x2\":{\"name\":\"y2\",\"type\":\"z2\",\"values\":[19,20,21,22,23,24]}," +
                    "\"x3\":{\"name\":\"y3\",\"type\":\"z1\",\"values\":[19,20,21,22,23,24]}," +
                    "\"x4\":{\"name\":\"y4\",\"type\":\"z2\",\"values\":[19,20,21,22,23,24]}" +
                    "}}";
    System.out.println(s);

    JSONObject json = new JSONObject(s);
    JSONObject object2 = json.optJSONObject("objects2");
    if (object2 == null) {
        return;
    }

    JSONArray result = new JSONArray();

    for (Object key : object2.keySet()) {
        JSONObject object = object2.getJSONObject(key.toString());

        String type = object.optString("type");
        if ("z1".equals(type)) {
            System.out.println(object.toString());
            result.put(object);
        }
    }

    System.out.println(result);
}
于 2014-07-25T14:22:42.873 回答
-1

您始终可以将其转换为字符串并使用 json-path: https ://code.google.com/p/json-path/

于 2014-07-25T14:09:42.360 回答