1

jsonオブジェクトを返すRESTサービスを呼び出しています。Jacksonとデータバインディングを使用して、JavaBeansへの応答を逆シリアル化しようとしています。

Jsonの例は次のようなものです。

{
    detail1: { property1:value1, property2:value2},
    detail2: { property1:value1, property2:value2},
    otherObject: {prop3:value1, prop4:[val1, val2, val3]}
}

基本的に、detail1とdetail2は同じ構造であるため、単一のクラスタイプで表すことができますが、OtherObjectは別のタイプです。

現在、私は次のようにクラスを設定しています(これは私が好む構造です):

class ServiceResponse {
    private Map<String, Detail> detailMap;
    private OtherObject otherObject;

    // getters and setters
}

class Detail {
    private String property1;
    private String property2;

    // getters and setters
}

class OtherObject {
    private String prop3;
    private List<String> prop4;

    // getters and setters
}

次に、次のようにします。

String response = <call service and get json response>
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(response, ServiceResponse.class)

問題は、必要な構造を取得するためにマッピングと注釈を正しく構成する方法についてのドキュメントを読み損なうことです。detail1、detail2でDetailクラスを作成し、otherObjectでOtherObjectクラスを作成したいと思います。

ただし、詳細クラスをマップに保存して、簡単に区別して取得できるようにする必要があります。また、将来のサービスでdetail3、detail4などが返されることも必要です(つまり、Map in ServiceResponseは次のようになります "{detail1:Detail object, detail2:Detail object, ...})。

これらのクラスにはどのように注釈を付ける必要がありますか?または、このJSONモデルに合うようにクラスを構造化するためのより良い方法があるのでしょうか。助けに感謝します。

4

1 に答える 1

3

次のように、ServiceResponse の 2 引数メソッドで@JsonAnySetterを使用するだけです。

@JsonAnySetter
public void anySet(String key, Detail value) {
    detailMap.put(key, value);
}

@JsonAnySetter は不明なプロパティのフォールバックであるため、「プロパティ」は 1 つしか持てないことに注意してください。JsonAnySetter の javadoc は、引数が 1 つのメソッドに適用する必要があると記載されているため、正しくないことに注意してください。Jackson ではいつでも小さなバグを開くことができます ;)

于 2012-08-27T13:31:08.610 に答える