我有一个杰克逊问题。
有没有一种方法可以反序列化可能具有两种类型的属性,对于某些对象,它看起来像这样
"someObj" : { "obj1" : 5, etc....}
然后对于其他人则显示为空数组,即
"someObj" : []
任何帮助表示赞赏!
谢谢!
Jackson目前没有内置配置来自动处理这种特殊情况,因此必须进行自定义反序列化处理。
以下是这种自定义反序列化的外观示例。
import java.io.IOException; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.Version; import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import org.codehaus.jackson.annotate.JsonMethod; import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.module.SimpleModule; public class JacksonFoo { public static void main(String[] args) throws Exception { // {"property1":{"property2":42}} String json1 = "{\"property1\":{\"property2\":42}}"; // {"property1":[]} String json2 = "{\"property1\":[]}"; SimpleModule module = new SimpleModule("", Version.unknownVersion()); module.addDeserializer(Thing2.class, new ArrayAsNullDeserializer()); ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY).withModule(module); Thing1 firstThing = mapper.readValue(json1, Thing1.class); System.out.println(firstThing); // output: // Thing1: property1=Thing2: property2=42 Thing1 secondThing = mapper.readValue(json2, Thing1.class); System.out.println(secondThing); // output: // Thing1: property1=null } } class Thing1 { Thing2 property1; @Override public String toString() { return String.format("Thing1: property1=%s", property1); } } class Thing2 { int property2; @Override public String toString() { return String.format("Thing2: property2=%d", property2); } } class ArrayAsNullDeserializer extends JsonDeserializer<Thing2> { @Override public Thing2 deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = jp.readValueAsTree(); if (node.isObject()) return new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY).readValue(node, Thing2.class); return null; } }
(您可以使用DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY强制输入始终绑定到集合,但是鉴于当前如何描述问题,我可能不会采用这种方法。)