内部にハッシュマップの定義があるクラスをデシリアライズできないという問題が発生しています。
私のクラスは次のように定義されています:
public class <T extends Serializable> MyClass1 {
private Map<String,List<MyClass2<T>>> entity;
boolean moreData=false;
public Map<String,List<MyClass2<T>>> getEntity() {
return entity;
}
public void setEntity(Map<String,List<MyClass2<T>>> entity) {
this.entity = entity;
}
public boolean isMoreDataAvailable()
{
return moreData;
}
}
クラスのコンテンツをシリアル化すると、次のような出力が生成されます。
ObjectMapper om = getObjectMapper();
om.writeValueAsString(myclass1inst);
{
"MyClass1" : {
"entity" : {
"java.util.HashMap" : {
"SITE_ADD" : {
"java.util.ArrayList" : [ {
"MyClass2" : {
"priority" : 3,
"groupName" : null,
"payload" : {
"MyClass3" : {
"networkType" : "HIGH_SPEED_LAN",
"nativeSite" : true
}
"groupOrderType" : null,
"entityGuid" : null
}
} ]
}
}
},
"moreDataAvailable" : false
}
}
問題は、この例外で逆シリアル化が失敗していることです。
ObjectMapper om = getObjectMapper();
om.readValue(content, MyClass1.class);
2013-06-27 02:55:47,822 [[ACTIVE] プッシュ リクエストのデシリアライズ中にエラーが発生しました: 無効なタイプ ID 'SITE_ADD' (ID タイプ 'Id.class' の場合): そのようなクラスが見つかりません (参照チェーンを介して: MyClass1["entity "])
なぜ json は、文字列 site_add が Id.class 型であると考える必要があるのですか?
jackson json のドキュメントを読むと、HashMap を次のように登録する必要があることがわかりました。
http://wiki.fasterxml.com/JacksonInFiveMinutes
マップ結果 = mapper.readValue(src, new TypeReference>() { });
カスタム逆シリアル化を定義するために@jsondeserialableを実装する必要がありますか。あなたの提案を教えてください。
オブジェクトの初期化に関するコードは次のとおりです
public static ObjectMapper getObjectMapper() {
ObjectMapper om = new ObjectMapper();
// to remove wrapping of root element
om.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, false);
om.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
// to handle inheritence
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_OBJECT);
// to ignore getters which doesnt have setters
om.configure(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false);
// to ignore extra properties during deserialization
om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
return om;
}
上記の例では、変数 T は MyClass3 を指しています。