2016-03-08 7 views
0

Используя Simple-JSON в следующем форматированном файле JSON, у меня возникли проблемы с пониманием того, как обращаться к объектам в массиве под «именем».JSON Parsing Nested Array Objects

JSON файла:

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

я могу получить информацию обо всех других содержания, потому что они не находятся во вложенном массиве; Однако, когда я пытаюсь восстановить объекты под «name», все, что выводится, это String, найденная в файле 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 

Как вы можете видеть, "имя" выводит строку из файла JSON, а не каждое отдельное значение.

В конце концов, мне нужно написать универсальный код, который может принимать новые теги «searchData» для каждого входного файла.

  1. Может ли кто-нибудь направить меня, как получить объекты, хранящиеся внутри вложенных массивов?
  2. Возможно, мне нужна другая библиотека? Если да, то какой из них наиболее эффективен для Java? Я не программирую для Android, и я постоянно нахожу Библиотечные предложения для Android.

Приносим извинения, если это сообщение обмануто, но никакие другие должности не помогают мне.

ответ

0

Вы должны получить ваш firstname и lastname, как:

jo.get("name").get("firstname"); 
jo.get("name").get("lastname"); 
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 в зависимости от требований.

0

Я понимаю, что вы хотите, чтобы теги searchData принимались во внимание при разборе JSON. Я бы предложил использовать Google Gson для этого случая.

Вы можете написать POJO, который возвращает ArrayList<User> для вашего JSON.

how use Google Gson