2016-12-23 6 views
4

私は内部マップを持つPOJOを持っています。これをJSONからHashMapに逆シリアル化したいが、Jacksonは内部マップをJSONからLinkedHashMapにデシリアライズする。マップのタイプを "Map"から "HashMap"に変更することでHashMapを使用することができますが、マップの特定の実装にデシリアライズするようジャクソンに指示する方法があるかどうかを知りたいですか?ここでJackson JSONオブジェクトマッパーは、HashMapの代わりにLinkedHashMapにデシリアライズします

はJSONです:

{ 
    "transforms": { 
     "variable_name1": [{ 
      "min": 100, 
      "max": 200, 
      "value": 0.6 
     }], 
     "variable_name2": [{ 
      "min": 100, 
      "max": 200, 
      "value": 0.6 
     }], 
     "variable_name3": [{ 
      "min": 100, 
      "max": 200, 
      "value": 0.6 
     }] 
    } 
} 

および変換クラス:

私はObjectMapperを使用していますどのように
public class Transformer { 
    Map<String, List<Transform>> transforms; 

    public Transformer() { 
     transforms = new HashMap<String, List<Transform>>(); 
    } 

    public void setTransforms(Map<String, List<Transform>> transforms) { 
     this.transforms = transforms; 
    } 
} 

try(Reader reader = new InputStreamReader(TransformTester.class.getResourceAsStream("transforms.json"), "UTF-8")) { 
      ObjectMapper objMapper = new ObjectMapper(); 
      Transformer tr = objMapper.readValue(reader, Transformer.class); 
} 
+1

なぜ気になりますか? –

+3

Jacksonは 'LinkedHashMap'を使ってJSONからのフィールドの順番を守っています。それは何が間違っていますか? – Andreas

+0

@ Andreas LinkedHashMapで余分なオーバーヘッドはありませんか?私は命令を気にしない。 – Seephor

答えて

0

あなたが他のいくつかのタイプをしたい場合は、ジャクソンコンバータを実装して、クラスに注釈を付けることができます。

public static class TransformConverter implements Converter<Map<String,List>,Map<String,List>>{ 

    @Override 
    public Map<String,List> convert(Map<String,List> map) { 
     return new HashMap<>(map); 
    } 

    @Override 
    public JavaType getInputType(TypeFactory typeFactory) { 
     return typeFactory.constructMapType(Map.class, String.class, List.class); 
    } 

    @Override 
    public JavaType getOutputType(TypeFactory typeFactory) { 
     return typeFactory.constructMapType(Map.class, String.class, List.class); 
    } 
} 



public static class Transformer { 
    @JsonDeserialize(converter = TransformConverter.class) 
    Map<String, List<Transform>> transforms; 
//rest of your class 
} 
関連する問題