1. ホーム
  2. java

[解決済み] ジャクソン・アノテーションを使用して、ネストされた値をプロパティにマッピングする方法は?

2022-12-07 01:32:26

質問

ある商品について、次のようなJSONで応答するAPIを呼び出したとします。

{
  "id": 123,
  "name": "The Best Product",
  "brand": {
     "id": 234,
     "name": "ACME Products"
  }
}

Jacksonアノテーションを使って、商品IDと商品名をうまくマッピングできていますね。

public class ProductTest {
    private int productId;
    private String productName, brandName;

    @JsonProperty("id")
    public int getProductId() {
        return productId;
    }

    public void setProductId(int productId) {
        this.productId = productId;
    }

    @JsonProperty("name")
    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }
}

そして、fromJsonメソッドを使って商品を作成します。

  JsonNode apiResponse = api.getResponse();
  Product product = Json.fromJson(apiResponse, Product.class);

しかし今、ネストされたプロパティであるブランド名を取得する方法を考え出そうとしています。このようなものがうまくいくことを期待していました。

    @JsonProperty("brand.name")
    public String getBrandName() {
        return brandName;
    }

しかし、もちろんそうではありませんでした。アノテーションを使って私が望むことを簡単に実現する方法はないでしょうか?

私が解析しようとしている実際の JSON 応答は非常に複雑で、単一のフィールドしか必要としないにもかかわらず、すべてのサブノードに対してまったく新しいクラスを作成する必要があるのは困ります。

どのように解決するのですか?

このように実現することができます。

String brandName;

@JsonProperty("brand")
private void unpackNameFromNestedObject(Map<String, String> brand) {
    brandName = brand.get("name");
}