我正在取消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无法正确序列化/反序列化LinkedHashMap但不知道如何使用ObjectFactory。
如果有任何帮助,我将不胜感激!
提前感谢!
(免责声明:我刚刚下载了flexjson并通过其源代码进行了调试,所以我的答案可能有点不完整。)
简而言之:
- 您通常无法使用flexjson按原始顺序获取条目
- 即使编写自定义
ObjectFactory
也不起作用 - 这很可能是有意的,也是正确的
详细信息:
首先,在new JSONDeserializer<LinkedHashMap<String,String>>()
中使用泛型只会影响可编译代码,flexjson不能使用这些信息来实际返回LinkedHashMap<String,String>
(这是因为编译器删除了泛型,而实现类在运行时没有这种泛型类型的信息)。
因此,深入了解反序列化过程中发生的情况,似乎在解析输入字符串时,数据会自动转换为正确的类型(字符串、日期、数字、列表等)。这是通过对所需数据类型进行某种自动检测来完成的,因为JSON在其数据中不提供类型信息,所以flexjson有一个内置列表来支持数据类型。当给出正确的类信息时,它还可以使用自定义映射为对象属性分配值(在序列化时,flexjson会向数据中添加一个字段class
来存储此类型信息;或者您可以手动设置,请参阅文档)。
但最重要的一点是,根据http://json.org-
对象是一组无序的名称/值对。
flexjson内部使用一个(无序的)映射来存储临时对象键和值。即使您告诉flexjson将数据作为LinkedHashMap
返回,在将数据转换为LinkedHashMap
之前,数据仍会被放入HashMap
中,因此此时原始订单不可用。(这可能可以通过用LinkedHashMap
替换flexjson.JSONTokener, line 442
中的地图创建来解决,但我自己没有尝试。)
结论:
看起来这种行为甚至不能通过提供自定义ObjectFactory
来改变,所以就我对代码的理解而言,您不能保留原始字段顺序。(我可以问一下为什么这对你的项目很重要吗?)
所以,如果有人找到了解决方案,请毫不犹豫地纠正我。