2

Web API から取得した JSON を Java オブジェクトに解析しようとしていますが、いくつか問題があります。

JSONは次のとおりです。

{
  "d":{
     "results":[
        {
          "__metadata" { some metadata I'm not interested in },
          "attribute1":"attribute id 1",
          "attribute2:"attribute value 1"
        },
        {
          "__metadata" { some metadata I'm not interested in },
          "attribute1":"attribute id 2",
          "attribute2:"attribute value 2"
        }
      ]
   }
}

次に、このデータを次の Java クラスにマップして、結果が Catalog オブジェクトになり、結果配列の値が CatalogEntry オブジェクトになるようにします。

public class Catalog {
  private final List<CatalogEntry> values;

  public Catalog() {
      values = null;
  }

  public Catalog(@JsonProperty("results") List<CatalogEntry> values) {
      super();
      this.values = values;
  }
}

public class CatalogEntry {
  private String attribute1;
  private String attribute2;

  public CatalogEntry() {}

  public CatalogEntry(@JsonProperty("attribute1") String attribute1, 
                      @JsonProperty("attribute2") String attribute2) {
    this.attribute1 = attribute1;
    this.attribute2 = attribute2;
  }
}

次の行で、JSON 文字列を Catalog オブジェクトに逆シリアル化しようとします。

Catalog catalog = genson.deserialize(json, Catalog.class);

その後、Catalog オブジェクトの値を取得しようとしましたが、空のように見えるため、NullPointerException が発生します。JSON の "d" オブジェクトにデシリアライズの問題があると思いますが、これを修正するにはどうすればよいですか? どんな助けでも大歓迎です。

4

1 に答える 1

0

問題は、引数のないコンストラクターと引数のあるコンストラクターの 2 つがあることです。この場合、Genson は空のコンストラクターを選択します。また、プロパティが表示されず、セッターがないため、値は設定されません。

したがって、Genson に特定のコンストラクターを使用させたい場合は、@JsonCreator で注釈を付ける必要があります。ところで、このオプションで Genson を構成すると、引数の JsonProperty("...") を削除できます。

Genson genson = new GensonBuilder()
  .useConstructorWithArguments(true)
  .create();

もう 1 つのオプションは、Genson にプライベート プロパティを使用するように指示することです。

Genson genson = new GensonBuilder()
  .useFields(true, VisibilityFilter.PRIVATE)
  .create();

その場合、Gensonは引数なしのものを使用するため、コンストラクターの注釈は必要ありません。最初のオプションをお勧めします。

于 2015-06-12T12:28:46.133 に答える