2013-04-08 26 views
5

私のケースでは、ジャクソンJSONパーサーの機能が固有の問題として認識されています。 私は、json形式に準拠していない可能性のある未知のファイルを解析するため、同じキー名を複数持つことになります。その場合、getFieldNames()のような関数を呼び出すと、複数の同じ単純要素の中で1つのエントリしか与えられなくなります。 これでget(String)を実行すると、同じキー値を持つJsonノードのうちの1つしか取得できなくなります。他のすべてを取得するはずです。 これに関するコメントや解決方法はありますか?Jacksonパーサーは同じ名前の複数のフィールド名を扱います

答えて

4

ほとんどのJSONパーサーは、同じネストレベルの重複キーが許可されていないため、入力ファイルを拒否します(これは事実上の標準です)。ただし、特定のパーサーでは、さまざまな方法で複製を処理できます。

ジャクソンでこれを処理する方法の1つは、通常の属性をエンティティクラスにマップし、潜在的な重複を@JsonAnySetterで処理することです。

public class Bag { 
    final transient Multimap<String, Object> multimap = LinkedListMultimap 
      .create(); 

    // regular properties, constructors etc 

    @JsonAnySetter 
    public void add(final String key, final String value) { 
     multimap.put(key, value); 
    } 
} 

注マルチマップの使用:通常のハッシュマップが重複キーを含めることはできませんので、マルチマップは、実用的なソリューションのための要件です。入力ファイルをデシリアライズした後、すべての「通常の」JSON属性は対応するエンティティプロパティにマップされますが、すべてのデュプリケートはマップに格納され、手動で処理することができます。

final List<Object> duplicatedValues = multimap.get(someKey); 

また、あなたは(天候にかかわらず、彼らは重複したりされない)すべてのトークンを受け取るだろうカスタムデシリアライザを作成することができます。

+0

重複する属性が見つかった場合、デシリアライザでエラーがスローされるようにするにはどうすればよいですか? – 2rs2ts

+0

@ 2rs2ts - デシリアライザのデフォルトの動作は、重複エラーが発生したときにエラーを投げることです。それが起こることを探しているのであれば、この答えで解決策は必要ありません。 – Perception

+0

ありがとうございます。 JSONのデシリアライザが自分のコードで実行されているのは混乱していたので、デフォルトの動作ではないという誤解がありました:)しかし、とにかくそれを知ることは良いことです。 – 2rs2ts