jackson映射对象或对象的列表取决于JSONinput

我有这个POJO:

public class JsonObj { private String id; private List<Location> location; public String getId() { return id; } public List<Location> getLocation() { return location; } @JsonSetter("location") public void setLocation(){ List<Location> list = new ArrayList<Location>(); if(location instanceof Location){ list.add((Location) location); location = list; } } } 

jsoninput中的“位置”对象可以是位置的简单实例,也可以是位置数组。 当它只是一个实例,我得到这个错误:

 Could not read JSON: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 

我试图实现一个自定义的setter,但它没有工作。 我怎么能根据jsoninput映射位置或列表?

Solutions Collecting From Web of "jackson映射对象或对象的列表取决于JSONinput"

更新: Mach Sarkissian的parsing工作正常,也可以像这样build议使用注释:

 @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List<Item> item; 

我对这个最恼人的问题深表同情,我也遇到了同样的问题,并在这里find了解决方法: https : //stackoverflow.com/a/22956168/1020871

稍微修改一下,我想出了这个,首先是generics类:

 public abstract class OptionalArrayDeserializer<T> extends JsonDeserializer<List<T>> { private final Class<T> clazz; public OptionalArrayDeserializer(Class<T> clazz) { this.clazz = clazz; } @Override public List<T> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { ObjectCodec oc = jp.getCodec(); JsonNode node = oc.readTree(jp); ArrayList<T> list = new ArrayList<>(); if (node.isArray()) { for (JsonNode elementNode : node) { list.add(oc.treeToValue(elementNode, clazz)); } } else { list.add(oc.treeToValue(node, clazz)); } return list; } } 

然后,属性和实际的反序列化程序类(Javagenerics并不总是漂亮):

 @JsonDeserialize(using = ItemListDeserializer.class) private List<Item> item; public static class ItemListDeserializer extends OptionalArrayDeserializer<Item> { protected ItemListDeserializer() { super(Item.class); } } 

这已经被jackson支持

 objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);