问题描述
我有一个杰克逊问题.
有没有办法反序列化一个可能有两种类型的属性,对于某些对象,它看起来像这样
Is there a way to deserialize a property that may have two types, for some objects it appears like this
"someObj" : { "obj1" : 5, etc....}
然后对于其他人它显示为一个空数组,即
then for others it appears as an empty array, i.e.
"someObj" : []
感谢任何帮助!
谢谢!
推荐答案
Jackson 目前没有内置配置来自动处理这种特殊情况,因此需要自定义反序列化处理.
Jackson doesn't currently have a built-in configuration to automatically handle this particular case, so custom deserialization processing is necessary.
以下是此类自定义反序列化的示例.
Following is an example of what such custom deserialization might look like.
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 强制输入始终绑定到集合,但鉴于当前描述的问题,这可能不是我采用的方法.)
(You could make use of DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY to force the input to always bind to a collection, but that's probably not the approach I'd take given how the problem is currently described.)
这篇关于Jackson 反序列化对象或数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!