繁体   English   中英

将 JSON 数组解析为对象集合

[英]Parse JSON arrays to collection of objects

我在将 json 数组解析为指定对象的 java 集合时遇到问题。

JSON 响应:

{
  "data": [
    {
      "country_code": "US", 
      "name": "United States", 
      "supports_region": "true", 
      "supports_city": "true"
    }, 
    {
      "country_code": "CA", 
      "name": "Canada", 
      "supports_region": "true", 
      "supports_city": "true"
    }, 
    {
      "country_code": "GB", 
      "name": "United Kingdom", 
      "supports_region": "true", 
      "supports_city": "true"
    }
  ]
}

接下来我有一个单一的国家类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class TargetCountry {

    @JsonProperty("country_code")
    private String countryCode;

    @JsonProperty("name")
    private String name;

    public String getCountryCode() {
        return countryCode;
    }

    public String getName() {
        return name;
    }

}

我正在使用 Jackson 库将 json 解析为 java。 如果没有包装数组的额外字段“数据”,一切都会好起来的。 由于“数据”字段,我不想额外制作包装类。 如何以优雅的方式解析该响应以接收: Collection<TargetCountry>例如:

RestTemplate restTemplate = new RestTemplate();
TargetCountry[] countryList = restTemplate.getForObject(uri, TargetCountry[].class);

您可以考虑两种选择:

  • 使用withRootName()方法以忽略根“数据”节点的方式为您的休息模板实例自定义 Jackson 对象映射器。 您可能需要咨询此问题如何自定义映射器。
  • 将结果作为 JsonNode 读取,跳过“数据”路径并将其转换为对象数组。

下面是例子:

public class JacksonRootValue {
    public static final String JSON = "{\n" +
            "  \"data\": [\n" +
            "    {\n" +
            "      \"country_code\": \"US\", \n" +
            "      \"name\": \"United States\", \n" +
            "      \"supports_region\": \"true\", \n" +
            "      \"supports_city\": \"true\"\n" +
            "    }, \n" +
            "    {\n" +
            "      \"country_code\": \"CA\", \n" +
            "      \"name\": \"Canada\", \n" +
            "      \"supports_region\": \"true\", \n" +
            "      \"supports_city\": \"true\"\n" +
            "    }, \n" +
            "    {\n" +
            "      \"country_code\": \"GB\", \n" +
            "      \"name\": \"United Kingdom\", \n" +
            "      \"supports_region\": \"true\", \n" +
            "      \"supports_city\": \"true\"\n" +
            "    }\n" +
            "  ]\n" +
            "}";

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class TargetCountry {
        @JsonProperty("country_code")
        public String countryCode;
        public String name;

        @Override
        public String toString() {
            return "TargetCountry{" +
                    "countryCode='" + countryCode + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper1 = new ObjectMapper();
        // customize the mapper
        mapper1.setConfig(mapper1.getDeserializationConfig().withRootName("data"));
        TargetCountry[] result1 = mapper1.readValue(JSON, TargetCountry[].class);
        System.out.println("Option 1: " + Arrays.toString(result1));

        // read as a JsonNode and then convert to an object
        ObjectMapper mapper2 = new ObjectMapper();
        JsonNode node = mapper2.readValue(JSON, JsonNode.class);
        TargetCountry[] result2 = mapper2.treeToValue(node.path("data"), TargetCountry[].class);
        System.out.println("Option 2: " + Arrays.toString(result2));
    }
}

输出:

Option 1: [TargetCountry{countryCode='US', name='United States'}, TargetCountry{countryCode='CA', name='Canada'}, TargetCountry{countryCode='GB', name='United Kingdom'}]
Option 2: [TargetCountry{countryCode='US', name='United States'}, TargetCountry{countryCode='CA', name='Canada'}, TargetCountry{countryCode='GB', name='United Kingdom'}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM