Я попытался сериализации и deseriliaze данные LinkedHashMap следующим образом:Flex JSON не в состоянии правильно сериализации/десериализации 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», как в примере ниже, например.
"class":"ch.qos.logback.classic.Logger","debugEnabled":true,"errorEnabled":true,"infoEnabled":true}
или, возможно, есть другой способ сделать это. Кто-нибудь может помочь? Спасибо
После введения ObjectFactory как предложено chubbsondubs:
объект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, [email protected]}
Спасибо, но в то время сортировка карты уже изменилась. Смотрите мой отредактированный комментарий наверху. –
Это потому, что вы фактически ничего не делали в своей ObjectFactory. То, что вы выписали, это HashMap (который не имеет порядка), который использует flexjson, прежде чем он свяжет этот HashMap с объектом, созданным ObjectFactory. Вы должны перевести это в LinkedHashMap, создав экземпляр внутри ObjectFactory и перемещая в него значения. – chubbsondubs