4

かなり複雑な POJO JSON を逆シリアル化しようとしています。ここでは、型解決のために特定のプロパティ名を定義する必要がありますが、このかなり単純な機能を見つけることができませんでした。

次のようなクラスを想定します。

class Example {
  int id;
  Map<String,Object> extras;
}

Jackson は POJO を JSON に正しくシリアル化し、マップは期待どおりにキー値マップにシリアル化されます。

{...
id:5,
extras:{object1:{...}, object2:{...}}
...}

ここで、extras オブジェクトを実際の型で明示的に逆シリアル化するように Jackson に伝えたいと思います。したがって、Jackson に「object1」をタイプ A に、「object2」をタイプ B にマッピングするように指示する必要があります。

これは可能ですか?ありがとう。

4

4 に答える 4

7

それに対処するための素晴らしいガイドがあります: http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html

そして別のチュートリアル:
http://programmerbruce.blogspot.de/2011/05/deserialize-json-with-jackson-into.html

2 番目のチュートリアルの 6 番目の例を変更すると、デシリアライザーには次のようなループが含まれます。

Map<String, Class> types = ...// map of supported types
JsonToken token = jsonParser.nextToken();
if(token == JsonToken.FIELD_NAME){ // "object1" etc.
    String name = jsonParser.getCurrentName();
    Class type = types.get(name);
    Object object = jsonParser.readValueAs(type);
}
于 2012-10-17T10:11:36.990 に答える
1

最も簡単な方法は、いわゆる「デフォルトの型付け」を有効にすることです。これは、@JsonTypeInfo注釈を追加するのとほぼ同じです (これにより、多相型の処理がサポートされます)。これにより、値に型情報が追加されます。そう:

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
于 2012-10-17T23:28:48.893 に答える
0

Extrasマップにこれらの2つのオブジェクト(object1とobject2)のみが含まれている場合は、次の操作を実行できます。

class TypeA {
    // TypeA body
}

class TypeB {
    // TypeB body
}

class Extras {
    private TypeA object1;
    private TypeB object2;
    // Getters and setters
}

class Example {
    int id;
    Extras extras;
}
于 2012-10-17T10:28:24.853 に答える
0

これは、カスタムデシリアライザーを使用して可能です。例については、このリンクを参照してください。一言で言えば、フィールドをマーシャリングしないタイプをジャクソンに伝える必要があります。ただし、シリアル化されたデータ(JSON)が動的に変化している場合、これはエラーが発生しやすい可能性があります。

次に、次のようにフィールドのセッターに簡単に注釈を付けることができます。

ObjectA value;

@JsonDeserialize(using=ObjectADeserializer.class)
public void setValue(ObjectA objectAValue) {
   this.value = objectAValue;
}
于 2012-10-17T10:29:56.053 に答える