杰克逊 - Map <string,object =“”>实现的序列化

时间:2016-12-24 17:33:22

标签: java json serialization jackson jackson2

我有以下课程:

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

有什么想法吗?

2 个答案:

答案 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<>()));
    }
}