JSON解析嵌套数组对象

时间:2016-03-08 01:04:13

标签: java arrays json nested

在以下JSON格式的文件上使用Simple-JSON,我很难理解如何在" name"

下访问数组中的对象。

JSON文件:

[
    {
        "name":{
            "firstName": "Developer",
            "lastName": "D"
        },
        "id": 00, 
        "permissionLevel": 3, 
        "password": 12345
    },
    {
        "name":{
            "firstName": "Bob",
            "lastName": "Smith"
        }, 
        "id": 01, 
        "permissionLevel": 2, 
        "password": 23456
    }
]

我能够获取所有其他内容的信息,因为它们不在嵌套数组中;但是,当我尝试在" name"下检索对象时,输出的所有内容都是在JSON文件中找到的字符串。

当前代码:

String[] searchData = {
                    "name",
                    "firstName",
                    "lastName",
                    "id",
                    "permissionLevel",
                    "password"
                };

jsonArray = (JSONArray)new JSONParser().parse(s);
for(int i = 0; i < jsonArray.size(); i++){
    JSONObject jo = (JSONObject)jsonArray.get(i);
    for(int j = 0; j < searchData.length; j++){
        System.out.println(
                searchData[j] + ": " + jo.get(searchData[j]));
    }
}

输出:

name: [{"firstName":"Developer","lastName":"D"}]
firstName: null
lastName: null
id: 0
permissionLevel: 3
password: 12345
name: [{"firstName":"Bob","lastName":"Smith"}]
firstName: null
lastName: null
id: 1
permissionLevel: 2
password: 23456

如你所见,&#34; name&#34;从JSON文件输出一个String,而不是每个单独的值。

最后,我需要编写一个通用代码,可以接受新的&#34; searchData&#34;每个文件输入的标签。

  1. 有人可以指导我如何获取所持有的物品 在嵌套数组中?
  2. 或许我需要使用不同的图书馆?如果是这样,哪一个对Java最有效?我没有为Android编程,我不断寻找Android的图书​​馆建议。
  3. 如果这篇文章是一个骗局,我很抱歉,但没有其他帖子帮助我。

3 个答案:

答案 0 :(得分:0)

您应该获得firstnamelastname,例如:

jo.get("name").get("firstname");
jo.get("name").get("lastname");

答案 1 :(得分:0)

要获取嵌套数组/对象中保存的对象,必须编写递归方法并将结构展平为地图。下面的例子显示了相同的内容:

public static void main(String args[]) throws ParseException {
    Object object =  new JSONParser().parse("[    {        \"name\":{            \"firstName\": \"Developer\",            \"lastName\": \"D\"        },        \"id\": 00,         \"permissionLevel\": 3,         \"password\": 12345    },    {        \"name\":{            \"firstName\": \"Bob\",            \"lastName\": \"Smith\"        },         \"id\":01,         \"permissionLevel\": 2,         \"password\": 23456    }]");
    Map<String, Object> pairs = new HashMap<>();
    addValues(object, pairs);
    System.out.println(pairs);
}

public static void addValues(Object object,  Map<String, Object> pairs){
    if(object instanceof JSONObject){
        JSONObject jsonObject = (JSONObject) object;
        for(String key : jsonObject.keySet()){
            if(jsonObject.get(key) instanceof JSONObject || jsonObject.get(key) instanceof JSONArray){
                addValues(jsonObject.get(key), pairs);
            }else{
                pairs.put(key, jsonObject.get(key));
            }
        }
    }else if(object instanceof JSONArray){
        JSONArray jsonArray = (JSONArray)object;
        for(Object element : jsonArray){
            addValues(element, pairs);
        }
    }
}

您可以根据需要调整此方法以获取name.firstname或name.lastname等键。

答案 2 :(得分:0)

我了解您希望在解析searchData时考虑JSON标记。我建议在这种情况下使用Google Gson

您可以编写一个POJO,为您的JSON返回ArrayList<User>

请参阅how use Google Gson

上的这篇文章