как получить значения дочернего массива в массиве json - PullRequest
1 голос
/ 18 января 2020

My Result and Expected Result Как я могу получить значения массива дочернего массива в JSON, который является значением массивов A, которые я хочу заполнить результатом в списке, таком как "Brimstone" , "Крест", "Голгофа". Этот вопрос на самом деле является расширением вопроса, который я задал, прежде чем полный код можно найти в моем предыдущем вопросе здесь Как получить значение дочернего узла json массив

Мой JSON Файл

{
  "schools": [
    {
      "A": [
        {
          "name": "Brimstone"
        },
        {
          "name": "Cross"
        },
        {
          "name": "Calvary"
        }
      ]
    }
  ]
}

Мой Java Код

    private void parseResult_GetWebData(String result) {
        try {
            JSONObject response = new JSONObject(result);
            JSONArray jsonArray = response.getJSONArray("schools");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.optJSONObject(i);
                JSONArray jsonArray1 = jsonObject.getJSONArray("A");

                for (int k = 0; k < jsonArray1.length(); k++) {
                    JSONObject jsonObject1 = jsonArray1.optJSONObject(k);
                    String name = jsonObject1.optString("name");

                    List<SchoolClass> schoolClassList;
                    schoolClassList = new ArrayList<>();

                    SchoolClass schoolClass = new SchoolClass();
                    schoolClass.setName(name);
                    schoolClassList.add(schoolClass);
                }

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

С моим кодом я получаю пустой результат в своем списке

Ответы [ 2 ]

1 голос
/ 18 января 2020

Попробуйте этот код

Вы создаете список массива пользовательских объектов для каждого объекта A

private void parseResult_GetWebData(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray jsonArray = response.getJSONArray("schools");
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.optJSONObject(i);
            JSONArray jsonArray1 = jsonObject.getJSONArray("A");

            List<SchoolClass> schoolClassList = new ArrayList<>();

            for (int k = 0; k < jsonArray1.length(); k++) {
                JSONObject jsonObject1 = jsonArray1.optJSONObject(k);
                String name = jsonObject1.optString("name");

                SchoolClass schoolClass = new SchoolClass();
                schoolClass.setName(name);
                schoolClassList.add(schoolClass);
            }

        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}
0 голосов
/ 18 января 2020

У вас есть простой способ решить эту проблему, используя Джексона (ObjectMapper)

1- Читать JSON файл

2 - Десериализовать его, используя ObjectMapper для Map

3- Доступ к нужному значению с использованием методов Map и List

 //Create objectMapper instance
 ObjectMapper objectMapper = new ObjectMapper();

 //Deserizalize
 Map map = objectMapper.readValue(jsonValue, Map.class);

 //Get desired value(List of children nodes)
 List<Map> childs = ((List<Map>)((Map)((List)objectMapper.
 readValue(file, Map.class).
 get("schools")).
 get(0)).get("A"));

 childs.stream().forEach(child->{

        System.out.println(child.get("name"));

 });

Результаты

Brimstone, Cross, Calvary


Последнее, но не менее важное , есть другой способ , который намного более стандартен.

1- Создать Dtos ( Java объектов) в соответствии с вашим JSON

2 - конвертируйте JSON в объекты Dto и просто используйте установщик и получатель этих объектов.

  • Создание объекта Dto для A

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ADto {
    
    @JsonProperty(value = "name")
    private String name;
    
    //Getters and Setters
    
    }
    
  • Создание объекта Dto для школ

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class SchoolDto {
    
    @JsonProperty(value = "A")
    private List<ADto> aDtos;
    
    //Getters and Setters
    
    }
    
  • Создание объекта Dto для родительского элемента JSON

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ParentDto {
    
    @JsonProperty(value = "schools")
    List<SchoolDto> schools;
    
    //Getters and Setters
    
    }
    
  • Преобразование JSON в Dtos

    //Create objectMapper instance
    ObjectMapper objectMapper = new ObjectMapper();
    
    //Deserizalize JSON
    ParentDto parentDto =objectMapper.readValue(jsonValue,ParentDto.class);
    
    //Get desired value
    SchoolDto schoolDto = parentDto.getSchools().get(0);
    List<ADto> names =schoolDto.getaDtos();
    
    //Result
    names.stream().forEach(aDto -> {
        System.out.println(aDto.getName());
    });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...