Flexjson无法反序列化LinkedHashMap



我正在取消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来改变,所以就我对代码的理解而言,您不能保留原始字段顺序。(我可以问一下为什么这对你的项目很重要吗?)

所以,如果有人找到了解决方案,请毫不犹豫地纠正我。

相关内容

  • 没有找到相关文章