2016-09-29 3 views
1

のTypeResolverBuilder次のテストアプリデシリアライズプリミティブ長いフィールド・ジャクソン

import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.core.JsonFactory; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     // Create test data 
     Data data = new Data(); 
     data.key = 1; 
     Map<String, Object> mapData = new HashMap<>(); 
     mapData.put("longInMap", 2L); 
     mapData.put("longAsField", data); 

     // Configure Jackson to preserve types 
     JsonFactory factory = new JsonFactory(); 
     ObjectMapper mapper = new ObjectMapper(factory); 
     StdTypeResolverBuilder resolver = new StdTypeResolverBuilder(); 
     resolver.init(JsonTypeInfo.Id.CLASS, null); 
     resolver.inclusion(JsonTypeInfo.As.PROPERTY); 
     resolver.typeProperty("__t"); 
     mapper.setDefaultTyping(resolver); 
     mapper.enable(SerializationFeature.INDENT_OUTPUT); 

     // Serialize 
     String json = mapper.writeValueAsString(mapData); 
     System.out.println("json = " + json); 

     // Deserialize 
     Map deserializedData = mapper.readValue(json, Map.class); 
    } 

    static class Data { 

     public long key; 
    } 
} 

を実行しているとき、私は、この出力と例外

json = { 
    "__t" : "java.util.HashMap", 
    "longInMap" : [ "java.lang.Long", 2 ], 
    "longAsField" : { 
    "__t" : "com.pinkmatter.bean.serialization.Main$Data", 
    "key" : [ "java.lang.Long", 1 ] 
    } 
} 
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Class java.lang.Long not subtype of [simple type, class long] (through reference chain: java.util.HashMap["longAsField"]->com.pinkmatter.bean.serialization.Data["key"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:379) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:339) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1591) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:278) 
    ... 
Caused by: java.lang.IllegalArgumentException: Class java.lang.Long not subtype of [simple type, class long] 
    at com.fasterxml.jackson.databind.type.TypeFactory.constructSpecializedType(TypeFactory.java:359) 
    at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:72) 
    at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:42) 
    ... 

を取得を使用している間、私は基本的な昔ながらのJavaの束をシリアル化しようとしていますコレクション内の値の型(上記の例では "longInMap"はLongオブジェクトのままでなければなりません)を保持しようとしている間に、私たちが使用しているライブラリのオブジェクト(クラスを変更したり注釈を追加することはできません。

Dataクラスのプリミティブpublic long keyをデシリアライズしようとすると、ジャクソンは上記の例外をスローします。型をpublic int keyに変更すると例外はスローされず、逆シリアル化が機能します。

また、オブジェクトの種類が多く、コンパイル時に正確に何がシリアル化されるのかわからないため、ミックスインを使用するとうまくいかないと思います。

コレクション内のオブジェクトのタイプを維持しながら、プリミティブな長いフィールドを直列化解除する方法が間違っているか、回避策があるかどうかを教えてください。

私はJackson 2.8.3を使用しています。

答えて

0

この問題を回避するには、修正プログラムが実施された

StdTypeResolverBuilder resolver = new StdTypeResolverBuilder() { 
     @Override 
     public TypeSerializer buildTypeSerializer(SerializationConfig config, JavaType baseType, Collection<NamedType> subtypes) { 
      if (baseType.isPrimitive()) { 
       return null; 
      } 
      return super.buildTypeSerializer(config, baseType, subtypes); 
     } 

     @Override 
     public TypeDeserializer buildTypeDeserializer(DeserializationConfig config, JavaType baseType, Collection<NamedType> subtypes) { 
      if (baseType.isPrimitive()) { 
       return null; 
      } 
      return super.buildTypeDeserializer(config, baseType, subtypes); 
     } 

    }; 

StdTypeResolverBuilder resolver = new StdTypeResolverBuilder(); 

を置き換えるために、ここでhttps://github.com/FasterXML/jackson-databind/issues/1395

を回避策がされて提供されたと後にジャクソン・データバインド2.8.4で利用できるようになりますこの回避策はもはや必要ではありません。

関連する問題