2016-07-25 9 views
0

StdDeserializer<T>を使用してカスタムデシリアライザを実装しようとしています。私のdeserialize(JsonParser, DeserializationContext)メソッドでは、を使用して、{ "toMap": { "a": "b", "a": "c" } }であると仮定してMultimapを読み込もうとしています。Jackson JsonParser readValueAs Multimap

私は、フィールド名が"toMap"であると仮定して、私はこれを試みました:Multimap<String, Object> rawConditions = jsonParser.readValuesAs(new TypeReference<LinkedListMultimap<String, Object>>() {});しかし、それはコンパイルエラーにつながります。互換性のないタイプがあります。Multimap<String, Object>が必要ですが、Iterator<Object>が見つかりました。

+0

入力例を解析した後に、「マルチマップ」に何を書くべきでしょうか? – Xaerxess

+0

回答を追加しました。しかし、シリアライゼーション側のコントロールがあれば、{"a": "b"、 "a": "c"}ではなく{"a": "" b " } – Joel

答えて

0

グアバのMultimap<K, V>あなたはもちろん、Multimapに非直列化することができない、Map<K, Map<V, X>>を持っている({ "toMap": { "a": "b", "a": "c" } })おおよそMap<K, Collection<V>>と同等のが、あなたのデータです。 Guavaの使用を主張する場合は、それを逆シリアル化してTableにすることができます。もちろん、私はあなたがjackson-datatypes-collectionsを使用してGuavaModuleObjectMapperに登録していると仮定します。

EDIT:あなたはマルチマップ(すなわち{ "a": "b", "a": "c" })としてを "toMap" をデシリアライズしたい場合、それは(あなたがしたい場合やMap<K, Collection<V>>)もMultimap<K, V>有効ではなく、むしろMap<K, V>

  • 重複したキーを持っています"a"
  • { "a": ["b"], "x": ["c"] }のようなもので、有効なMultimapである必要があります。

Map<String, String>としてデシリアライズしてください。

+0

"a"キーが複製されていることを除いて、マルチマップとして解釈できます。 – Joel

+0

@Joel OPが '' toMap'' ** value **を解析したい場合、有効な 'Multimap '(または必要ならば 'Map >')ではなく 'Map ' 。 – Xaerxess

+0

そうは思わない。 {"a": "b"、 "a": "c"}は、マルチマップとしては大丈夫です。データは単なるデータです。あなたはそれをあなたが望むように解釈することができます。 – Joel

0

私はmultimapのための任意の組み込みのコンバータを認識していないけど、あなたはあなたの例では探しているマルチマップと仮定すると(「toMap」なし){ "a": "b", "a": "c" }で、あなたが期待していること、それは{"a": ["b", "c"]}ようなものに変換し、あなたjsonトークンをトークンで解析し、それをマルチマップに追加することで独自のデシリアライザを作成できます。例:

public class CustomDeserializer extends JsonDeserializer<Multimap<String, String>> { 

    @Override 
    public Multimap<String, String> deserialize(JsonParser jp, DeserializationContext dc) 
      throws IOException { 
     Multimap<String, String> multimap = LinkedListMultimap.create(); 
     JsonToken currentToken = null; 
     while ((currentToken = jp.nextValue()) != null) { 
      switch (currentToken) { 
       case VALUE_STRING: 
        multimap.put(jp.getCurrentName(), jp.getText()); 
        break; 
      } 
     } 
     return multimap; 
    } 
}