我有以下课程:
public class Some implements Map<String, Object>{
private Map<String, Object> innerMap;
//implementation that can only set innerMap in constructor and cannot add or remove values
}
问题是我无法正确地在杰克逊中反序列化。如果我在没有默认输入的情况下序列化,那就没关系,因为它被序列化为{“one”:“two”}并且正确反序列化(我必须用
实现反序列化器)return new Some(jp.readValueAs(new TypeReference<HashMap<String,Object>>(){}));
当我使用默认打字时,会将其序列化为
["com.class.Some",{"one":"two"}]
但反序列化正在抛出
com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.util.HashMap
有什么想法吗?
答案 0 :(得分:0)
使用let parametersForFriends = ["fields": "name,id"]
let graphRequestForFriends = FBSDKGraphRequest(graphPath: "me/friends", parameters: parametersForFriends)
注释您的构造函数:
@JsonCreator
答案 1 :(得分:0)
这就是我需要的 - 自定义反序列化器:
public class SomeDeserializer extends JsonDeserializer<Some> {
@Override
public Object deserializeWithType(JsonParser jsonParser, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException {
return typeDeserializer.deserializeTypedFromObject(jsonParser, ctxt);
}
@SuppressWarnings("unchecked")
@Override
public Some deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException {
JsonDeserializer<Object> deserializer = ctxt.findRootValueDeserializer(
ctxt.getTypeFactory().constructMapType(Map.class, String.class, Object.class));
return new Some((Map) deserializer.deserialize(jp, ctxt, new HashMap<>()));
}
}