我正在反序列化json对象,如下所示
{
"b":"value1",
"a":"value2",
"d":"value3",
"c":"value4",
"f":"value5",
"e":"value6"
}
但是我得到的ClassCastException如下所示
java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap
我的反序列化代码是
LinkedHashMap<String, String> map = new JSONDeserializer<LinkedHashMap<String, String>>().deserialize(JSONstring);
但是当我使用HashMap而不是LinkedHashMap时,它可以工作,但输出的排序如下(它不是原始顺序)。
{
a=value2,
b=value1,
c=value4,
d=value3,
e=value6,
f=value5
}
我想按原始顺序获取输出。 我发现了这个相关的链接 Flex JSON unable to properly serialize/deserialize LinkedHashMap 但是没有得到如何使用ObjectFactory。
我将不胜感激任何帮助!
提前致谢!
答案 0 :(得分:0)
(免责声明:我刚刚下载了flexjson并通过其源代码进行了调试,因此我的回答可能稍微不完整。)
简而言之:
ObjectFactory
也行不通。详细信息:
首先,在new JSONDeserializer<LinkedHashMap<String,String>>()
中使用泛型只影响可编译代码,flexjson不能使用此信息实际返回LinkedHashMap<String,String>
(这是因为编译器删除了泛型,而实现类没有运行时此通用类型的信息)。
因此,深入研究反序列化过程中发生的情况,似乎在解析输入字符串时,数据会自动转换为正确的类型(字符串,日期,数字,列表等)。这是通过使用某种所需数据类型的自动检测来完成的,因为JSON不在其数据中提供类型信息,因此flexjson有一个内置列表来支持数据类型。当给出正确的类信息时,它还可以使用自定义映射为对象属性赋值(在序列化时,flexjson向数据添加字段class
以存储此类型信息;或者您可以手动设置此值,请参阅文档)
但重点是 - 根据http://json.org -
对象是一组无序的名称/值对。
flexjson在内部使用(无序)映射来存储临时对象键和值。即使您告诉flexjson将数据作为LinkedHashMap
返回,数据仍然会被转换为HashMap
,然后才会转换为LinkedHashMap
,因此原始订单不可用于点。 (这可以通过用flexjson.JSONTokener, line 442
替换LinkedHashMap
中的地图创建来解决,但我自己也没有尝试过。)
<强>结论:强>
看起来这个行为甚至无法通过提供自定义ObjectFactory
来更改,因此,据我所知,您无法保留原始字段顺序。 (请问为什么这对你的项目很重要?)
所以,如果有人找到解决方案,请不要犹豫纠正我。