【问题标题】:how to get the values of a child array in json array如何获取json数组中子数组的值
【发布时间】:2020-05-04 22:15:56
【问题描述】:

如何获取 JSON 中子数组的数组值,即 A 数组的值 我想将结果填充到一个列表中,例如“Brimstone”、“Cross”、“Cal髅地”,这个问题实际上是我在之前的问题中可以找到完整代码之前提出的问题的扩展How to get the value of a child node of a json array

我的 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();
        }
    }

使用我的代码,我的列表中的结果为空白

【问题讨论】:

  • 您已将schoolClassList 设为局部变量。它没有在任何地方通过。您声称如何填充 ListView?
  • @user7 我正在另一个活动中填充列表,当我的 JSON 像这样编写 { "A":[ {"name" : "Brimstone"}, {"name" : "Cross"}, {"name" : "Calvary"} ] } 时,列表已成功填充,但我需要向其中添加另一个数组,这是主要问题,因此 listView已在代码的其他实例中填充,但我的最终 JSON 文件是按照问题中的方式编写的,所以我只是从学校读取数据然后到 A 然后到 A 的值的正确方法

标签: java arrays json android-studio listview


【解决方案1】:

试试这个代码

您正在 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();
    }
}

【讨论】:

    【解决方案2】:

    您有一个使用 Jackson (ObjectMapper) 解决此问题的简单方法

    1- 读取 JSON 文件

    2- 使用ObjectMapper 将其反序列化为Map

    3- 使用MapList 方法访问所需的值

     //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"));
    
     });
    

    结果

    硫磺,十字架,加略山


    最后但并非最不重要的一点,还有另一种方式,它更加标准。

    1- 根据您的 JSON 创建 Dtos(Java 对象)

    2- 将 JSON 转换为 Dto 对象并简单地使用 setter 和 getter 那些对象。

    • 为 A 创建 Dto 对象

      @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
      
      }
      
    • 为 JSON 的父级创建 Dto 对象

      @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());
      });
      

    【讨论】:

    • 首先是使用 url 而不是文件,其次是如何从中获取字符串,因为如果我停在 get("A"));
    • 代替文件,您可以放置​​可以通过 web 服务或其他方式接收的 JSON 字符串
    • 我现在就修复它
    • @Serenit 我对其进行了编辑并添加了新的 sn-p 以显示如何获取子节点的名称
    • @Serenity 编辑第一个解决方案并放置新解决方案
    猜你喜欢
    • 2020-05-06
    • 2020-05-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多