让Jackson将单个JSON对象解释为具有一个元素的数组

有没有办法让jackson将单个JSON对象解释为具有一个元素的数组,反之亦然?

例如,我有两种略有不同的JSON格式,我需要两者都映射到同一个Java对象:

格式A (带有一个元素的JSON数组):

points : [ { date : 2013-05-11 value : 123 }] 

格式B (JSON对象,是的,我知道它看起来“错误”,但它是我给的):

 points : { date : 2013-05-11 value : 123 } 

目标Java对象,以上两者都应转换为:

 //Data.java public List points; //other members omitted //Point.java class Point { public String date; public int value; } 

目前,只有A才能正确解析数据。 我想避免直接篡改JSON本身。 jackson是否有一些配置可以篡改以使其接受B

尝试使用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY – 它应该适合你。

例:

 final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}"; final ObjectMapper mapper = new ObjectMapper() .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); final List points = mapper.readValue(json, new TypeReference>() { }); System.out.println(points); 

Jackson 1.x兼容版本使用DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY 。 所以上面的答案改为:

 final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}"; final ObjectMapper mapper = new ObjectMapper() .enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY); final List points = mapper.readValue(json, new TypeReference>() { }); System.out.println(points); 

通过下面给出的代码可以解决上述问题,这个工作原理

  final ObjectMapper objectMapper = new ObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); try { String jsonInString = objectMapper.writeValueAsString(products.get(j)); InventoryParser inventoryParser = objectMapper.readValue(jsonInString, InventoryParser.class); System.out.println(inventoryParser.getId()); } catch (IOException e) { e.printStackTrace(); } 

“InventoryParser”是一个POJO类。 “products.get(j)”是JSON字符串。