0

Jackson で解析しようとしている次の形式の JSON があります -

"response":{
"response_inner":{
"a":{"field1":2,"field2":0,"field3":5,"field4":0,"field5":[{"field5_1":"b","field5_2":1},{"field5_1":"c","field5_2":1}]},
"d":{"field1":2,"field2":6,"field3":11,"field4":0,"field5":[{"field5_1":"c","field5_2":1},{"field5_1":"b","field5_2":1}]},
"response_inner_bool":false
}
}

ここで、「a」、「b」などは、各応答で変化する可能性のある文字列です。

「response_inner」を表す Java オブジェクト (ResponseInner と呼びましょう) と、フィールドを含むオブジェクトを表す Java オブジェクト (これを FieldInfo と呼びましょう) を作成しましたが、@ を使用してこれを解析する方法がわかりません。 JsonCreator および @JsonProperty アノテーション - ResponseInner オブジェクトには、任意の数の String -> FieldInfo マッピングを含めることができます。

私はこのようにそれを解析しようとしました -

public class Response {
    private ResponseInner responseInner;

    @JsonCreator
    public Response(@JsonProperty("response_inner") ResponseInner responseInner) {
        this.reponseInner = responseInner;
    }
}

public class ResponseInner {
    private Map<String, FieldInfo> stringToFieldInfoMap;
    private boolean responseInnerBool;

    @JsonCreator
    public ResponseInner(Map<String, FieldInfo> stringToFieldInfoMap, @JsonProperty("response_inner_bool") boolean responseInnerBool ) {
        this.stringToFieldInfoMap = stringToFieldInfoMap;
        this.responseInnerBool = responseInnerBool;
    }
}

しかし、コンストラクターの Argument #0 にはプロパティ名の注釈がないと文句を言います。複数パラメーターのコンストラクターに Creator のアノテーションが付けられている場合は、名前が必要です。これを回避する方法について何か提案はありますか?

4

1 に答える 1

0

stringToFieldInfoMapとにかく ResponseInner 内で使用していないようです。なぜパラメータとして渡す必要があるのですか?

そのクラスで必要な場合は、コンストラクターに渡すのではなく、セッターを介して簡単に設定できます。

あるいは、レスポンスの実際のマッピングを処理する 3 番目のクラスを利用することもできます。これは、Response オブジェクトを消費します (これは、Map が削除された ResponseInner オブジェクトを消費します)。これにより、実際にはマッピングロジックを応答ロジックから切り離すことができます。

public class MappedResponse {
    private Map<String, FieldInfo> stringToFieldInfoMap;
    private Response response;

    public MappedResponse(Map<String, FieldInfo> stringToFieldInfoMap, Response response) {
        this.stringToFieldInfoMap = stringToFieldInfoMap;
        this.response = response;     
    }
}
于 2012-12-13T19:58:03.483 に答える