Flexjson无法反序列化LinkedHashMap

时间:2014-01-03 11:33:17

标签: java linkedhashmap flexjson

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

我将不胜感激任何帮助!

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

简而言之:

  • 您通常无法使用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来更改,因此,据我所知,您无法保留原始字段顺序。 (请问为什么这对你的项目很重要?)

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