如何使用动态Keyname解析JSON?

时间:2014-10-27 11:02:15

标签: java json

我有这样的JSON响应。

{
"array": [
    {
        "object1": {
            "aa": "somevalue1",
            "bb": "somevalue2",
            "cc": "somevalue3"
        }
    },
    {
        "object2": {
            "aa": "somevalue4",
            "bb": "somevalue5",
            "cc": "somevalue6"
        }
    }
]}

现在我可以从上面的响应中获取一个JSON数组。我想从aa中的对象bbcc读取值object1object2for loop

JSON是动态的,我的意思是object2也可以出现在object1之前(以相反的顺序),并且我可能会再获得一个具有相同结构的对象(object3)或者只有一个(object1object2object3)。

我不想这样做,因为我失败了:

JSONArray jsonArray = json.getJSONArray("array");
for (int i = 0; i < jsonArray.length(); i++) 
{
    JSONObject jsonObject = jsonArray.getJSONObject(i).getJSONObject("object1");
}

所以我的问题是如何在不依赖于对象名称或对象数量aa或{{1}的情况下阅读这些值bbccobject1 }或object2)?

3 个答案:

答案 0 :(得分:1)

我认为你应该有下一个类的Java端结构:

  1. Entity - 将保留aabbcc字段的课程

  2. Container - 一个由两个字段组成的类 - NameEntity,其中Name可以存储object1,{{1或者其他什么。

  3. 然后,您应该将提供的JSON反序列化为object2实体的集合/数组。

    希望这有帮助。

    更新:请查看此示例Collection deserialization

答案 1 :(得分:1)

看起来数组中的每个项只有一个键/值对,它保存另一个json对象,然后有几个。

如果是这种情况,那么你可能会做这样的事情:

for (int i = 0; i < jsonArray.length(); i++)
{
    JSONObject jsonObject = jsonArray.getJSONObject(i);

    JSONObject innerObject = jsonObject.getJSONObject(jsonObject.keys().next().toString());

    /// do something with innerObject which holds aa, bb, cc
}

您只需抓取包装对象中的第一个键,然后使用它来获取内部json对象。

答案 2 :(得分:0)

您应该使用java.util.Map等动态结构。试试这个:

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

public class JsonTest {

    public static void main(String[] args) {
        String json = "{\"array\": [{\"object1\": {\"aa\": \"somevalue1\",\"bb\": \"somevalue2\",\"cc\": \"somevalue3\"}},{\"object2\": {\"aa\": \"somevalue4\",\"bb\": \"somevalue5\",\"cc\": \"somevalue6\"}}]}";
        System.out.println(json);
        final MyJson parseJsonSpecification = parseJsonSpecification(json);
        System.out.println(parseJsonSpecification.array.get(0).get("object1"));
        System.out.println(parseJsonSpecification);
    }

    public static MyJson parseJsonSpecification(String jsonString) {
        try {
            if (StringUtils.isBlank(jsonString)) {
                return new MyJson();
            }
            MyJson ret;
            ret = new ObjectMapper().readValue(jsonString, new TypeReference<MyJson>() {
            });
            return ret;
        } catch (Exception ex) {
            throw new IllegalArgumentException("La expresión '" + jsonString + "' no es un JSON válido", ex);
        }
    }
}

class MyJson {
    public List<Map<String, Object>> array;
}