0

我正在反序列化一个 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。

我将不胜感激任何帮助!

提前致谢!

4

1 回答 1

0

(免责声明:我刚刚下载了 flexjson 并通过其源代码进行了调试,所以我的回答可能有点不完整。)

简而言之:

  • 您通常无法使用 flexjson 以原始顺序获取条目。
  • 即使编写自定义ObjectFactory也行不通。
  • 这很可能是有意和正确的。

详细地:

首先,使用泛型new JSONDeserializer<LinkedHashMap<String,String>>()只影响可编译的代码,flexjson不能使用这个信息来实际返回a LinkedHashMap<String,String>(这是因为编译器去掉了泛型,实现类在运行时没有这个泛型类型的信息)。

因此,深入研究反序列化过程中发生的情况,似乎在解析输入字符串期间,数据会自动转换为正确的类型(字符串、日期、数字、列表等)。这是通过对所需数据类型的某种自动检测来完成的,因为 JSON 在其数据中不提供类型信息,因此 flexjson 有一个内置列表来支持数据类型。当给定适当的类信息时,它还可以使用自定义映射为对象属性分配值(在序列化时,flexjson 会class在数据中添加一个字段来存储此类型信息;或者您可以手动设置它,请参阅文档)。

但重点是 - 根据http://json.org -

对象是一组无序的名称/值对。

flexjson 在内部使用一个(无序的)映射来存储临时对象的键和值。即使您告诉 flexjson 将数据作为 a 返回,数据在转换为 a 之前仍被LinkedHashMap放入a 中,因此此时原始订单不可用。(这可以通过用a替换地图创建来解决,但我自己没有尝试过。) HashMapLinkedHashMapflexjson.JSONTokener, line 442LinkedHashMap

结论:

看起来这种行为甚至无法通过提供 custom 来改变ObjectFactory,所以据我了解代码,您不能保留原始字段顺序。(请问为什么这对您的项目很重要?)

因此,如果有人无论如何找到解决方案,请不要犹豫纠正我。

于 2014-01-03T14:22:21.303 回答