1

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"
             }
        ]
}
4

1 に答える 1

0

さらに検索した後、Jackson のシリアライザーをオーバーライドせずに質問を解決することはできないという結論に達しました。

Jackson メーリング リストから、次の回答に進みます。

に使用される (デ) シリアライザーをオーバーライドすることがJsonNodeでき、これを使用して多態型 ID の処理を​​変更することもできます (シリアライザーdeserializeの場合と同様に、予期される型 ID の場合には別の方法があります)。これにより、ケースの処理が可能になる場合があります。

これが決定的な答えだと思います。

于 2013-10-23T22:51:10.373 に答える