【问题标题】:Parse JSON arrays to collection of objects将 JSON 数组解析为对象集合
【发布时间】:2014-08-21 20:54:44
【问题描述】:

我在将 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);

【问题讨论】:

    标签: java json spring facebook-graph-api jackson


    【解决方案1】:

    您可以考虑两种选择:

    • 使用withRootName() 方法为您的rest 模板实例定制Jackson 对象映射器,使其忽略根“数据”节点。您可能需要咨询this question如何自定义映射器。
    • 将结果作为 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'}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多