2

制御できないアプリケーションからの JSON オブジェクトをデシリアライズしようとしています。ここに私のJSON:

{"assembly":
     {"name":"mm9",
      "id":32,
      "chromosomes":[
             {"chromosome":
                  {"name":"MT"}
             }]}}

私のポジョは、

class Assembly{
      private String name;
      private int id;
      private ArrayList<Chromosome> chromosomes;
      // getters & setters
}
class Chromosome {
     private String name;
     //getter/setters

}

しかし、追加のフィールド「アセンブリ」と「染色体」のために機能しないため、次のような JSON を使用します。

{"name":"mm9",
  "id":32,
    "chromosomes":[    
             {"name":"MT"}
                 ] }}

それは単に機能します。より複雑なPOJOSを作成せずにこれを達成するために構成などを変更する方法はありますか?

4

1 に答える 1

1

問題は、最初のJSONスニペットにchromosomes辞書(マップ)があり、そのエントリの1つ(chromosome)がたまたまChromosomeオブジェクトに対応していることです。

Javaクラスへのより正確な直接マッピングは次のようになります。

class Assembly{
  ...
  private Map<String, Chromosome> chromosomes;
}

ソースJSONの形式を制御できないと述べているので、POJOを変更することに満足できない場合は、カスタムデシリアライザーを使用するか、直接マッピングにObjectMapperではなくJacksonのストリーミングサポートを使用することを検討してください。こちらです。

ちなみに、コレクションListは具体的なタイプ()ではなく、インターフェイスタイプ()で参照するのが最適ArrayListです。このクラスを参照するコードが、を使用していることを本当に気にかけている、または知る必要がある可能性はほとんどありません。代わりArrayListに、インターフェイスのみを参照するとList、必要に応じて他の実装を簡単に交換できます(一般原則として)。

于 2011-03-16T13:34:52.393 に答える