2016-12-24 16 views
0

のシリアライズは、私は以下のクラスを持っています。私は、デフォルトの入力なしでシリアライズした場合、それは{「1」:「2」}としてシリアル化されることから、それは、OKであると正しく非直列化(私はデフォルトのタイピングを使用するとき、私はジャクソン地図<文字列、オブジェクト>実装

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

これは私が必要なものである - カスタムデシリアライザを:

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

@JsonCreatorであなたのコンストラクタを注釈:

public static void main(String[] args) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 

    Some some = new Some(new HashMap<String, Object>() {{put("a", 1);}}); 

    String json = mapper.writeValueAsString(some); 
    System.out.println("serialized : " + json); 

    some = mapper.readValue(json, Some.class); 
    System.out.println("deserialized: " + some); 
} 

// Read only delegating Map 
public static class Some extends AbstractMap<String, Object> { 
    private Map<String, Object> delegate; 

    @JsonCreator 
    public Some(Map<String, Object> delegate) { 
     this.delegate = Collections.unmodifiableMap(delegate); 
    } 

    @Override 
    public Set<Entry<String, Object>> entrySet() { 
     return delegate.entrySet(); 
    } 
} 
+0

私はここでの問題は、いくつかの実装は、インタフェースの地図と@Override パブリックオブジェクトプットを持っているということです(文字列キー、オブジェクト値){ 新しいUnsupportedOperationExceptionをスローします( "不変です")。 }コードではこの例外が発生します。 – bojanv55

+0

この例のマップは不変であり、 'put'が呼び出されると' UnsupportedOperationException'がスローされます。 – teppic

関連する問題