jackson-databind
モジュールを使用して、Jackson 2.0 注釈ベースの JSON 処理を使用するように構成された、Spring MVC Web サービスで要求と応答を表す一連の Java クラスを作成しています。これらのクラスには、JSON オブジェクトのシリアル化と逆シリアル化を有効にするために、必要に応じて注釈が付けられたさまざまなフィールドが含まれています。
Map
ポリモーフィックな値を持つフィールドを含む POJO があります。Map の値は、主にString
、他のモデル クラス、特に として表される他の JSON オブジェクトなど、いくつかの型を取ることができますJsonNode
。
@JsonTypeInfo(use = Id.CLASS)
private Map<String, Object> outputValues;
アノテーションを使用すること@JsonTypeInfo
で、Jackson は結果の JSON でクラス名を適切にシリアル化し、値を適切な具象型に逆シリアル化できるようにします。
たとえば、 type の値ArrayNode
( のサブタイプJsonNode
) の場合、Jackson は"com.fasterxml.jackson.databind.node.ArrayNode"
結果の JSON にタイプ name を明示的に追加します。
outputValues: {
result: [
"com.fasterxml.jackson.databind.node.ArrayNode",
[
{
Content-Type: "application/json",
url: "http://server.url"
},
{
Content-Type: "application/json",
url: "http://server.url.2"
}
]
]
}
私が達成したいのは、JsonNode
またはそのサブタイプの 1 つがマップ値として検出された場合に、型名を明示的に追加せずに JSON オブジェクトがシリアル化されるという特殊なケースです。この例では、逆シリアル化時にArrayNode
、不明な配列構造が見つかったときに Jackson が生成します。遭遇すると、他のポリモーフィック型を生成し続けます。
上記の例は次のようになります。
outputValues: {
result:
[
{
Content-Type: "application/json",
url: "http://server.url"
},
{
Content-Type: "application/json",
url: "http://server.url.2"
}
]
}