を使用してマップします逆シリアル化JSON配列は、私は、JSONのような構造をしているジャクソン
MyInterface1
@Value.Immutable
@JsonSerialize(as = ImmutableMyInterface1.class)
@JsonDeserialize(as = ImmutableMyInterface1.class)
public interface MyInterface1 {
String id();
@JsonDeserialize(using = MyInterface1Deserializer.class)
List<MyInterface2> name();
}
MyInterface2を:私は次のようなデータ構造にマップする
{
"id" : "123",
"name" : [ {
"stuff" : [ {
"id" : "234",
"name" : "Bob"
}, {
"id" : "345",
"name" : "Sally"
} ]
} ]
}
@Value.Immutable
@JsonSerialize(as = ImmutableMyInterface2.class)
@JsonDeserialize(as = ImmutableMyInterface2.class)
public interface MyInterface2 {
@JsonDeserialize(using = StuffDeserializer.class)
Map<String, MyInterface3> stuff();
}
MyInterface3
@Value.Immutable
@JsonSerialize(as = ImmutableMyInterface3.class)
@JsonDeserialize(as = ImmutableMyInterface3.class)
public interface MyInterface3 {
String id();
String name();
}
私はMyInterface3にチェーンを下り続けるべきMyInterface1にこのJSONをマッピングするためにreadValue(stringWithJson,MyInterface1.class)
とObjectMapperを使用しています。この設定は、MyInterface2でListを使用していたときに機能していました。つまりList<MyInterface3> name();
ですが、これはリストの代わりにマップにするのが理想的です。内側のJSONのIDをキーとして使用するのが理想的です。これは、私は、次の構文を使用して値を取得できるようになります。やろうとしたときに Can not deserialize instance of com.foo.ImmutableMyInterface2$Json out of START_ARRAY token
: MyInterface1.get(0).MyInterface2.get("id1").name();
問題は、カスタムStuffDeserializer.classを作成しようとしたとき、私はエラーを取得していますということです。
public Map<String, MyInterface3> deserialize(JsonParser jsonParser, DeserializationContext ctxt)
throws IOException {
MyInterface2 foo = Unmarshaller.OBJECT_MAPPER.readValue(jsonParser, MyInterface2.class); // error here
...
これはジャクソンが「stuff」がJSON配列のListの原因であると考えているからだと思います。このJSONを内部JSONの値をキーとして使用するマップに非直列化する最善の方法は何ですか?