次のように LinkedHashMap データをシリアライズおよびデシリアライズしようとしました。
LinkedHashMap<String, Object> o = new LinkedHashMap<String, Object>();
o.put("1", "a");
o.put("2", "b");
o.put("3", "c");
o.put("4", new BigDecimal("9999999999999999999999.00999999999999999999999"));
String serialize = new JSONSerializer().deepSerialize(o);
System.out.println("serialize" + serialize);
LinkedHashMap deserialize = new JSONDeserializer<LinkedHashMap>().deserialize(serialize, LinkedHashMap.class);
System.out.println("deserialize:" + deserialize);
そして私は ClassCastException を取得します:
serialize{"1":"a","2":"b","3":"c","4":9999999999999999999999.00999999999999999999999}
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap
at com.JSONUtil.main(JSONUtil.java:161)
したがって、次のように逆シリアル化するときに、少し異なるアプローチを試みました。
HashMap deserialize = new JSONDeserializer<HashMap>().deserialize(serialize, HashMap.class);
System.out.println("deserialize:" + deserialize);
今回は結果が得られますが、マップは順不同です(現在HashMapを使用しているためだと思います)。また、元の形式のように BigDecimal 値が表示されません。
deserialize:{3=c, 2=b, 1=a, 4=1.0E22}
FlexJSON にはソートされたマップに問題があるようです。これは、以下の例のように「クラス」エントリを配置する方法がないためだと思います。
"class":"ch.qos.logback.classic.Logger","debugEnabled":true,"errorEnabled":true,"infoEnabled":true}
または、これを行う別の方法があるかもしれません。誰でも助けてもらえますか?ありがとうございました
chubbsondubs の提案に従って ObjectFactory を導入した後:
LinkedHashMap deserialize = new JSONDeserializer<LinkedHashMap>()
.use(LinkedHashMap.class, new ObjectFactory() {
public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) {
System.out.println("mymap:"value);
}
}).deserialize(serialize, LinkedHashMap.class);
値オブジェクトには HashMap タイプがあり、次のように出力されます。
mymap:{3=c, 2=b, 1=a, 4=flexjson.JsonNumber@104fc23}