【问题标题】:XStream (JSON) HashMap <String, String> DecodeXStream (JSON) HashMap <String, String> 解码
【发布时间】:2018-07-30 05:20:04
【问题描述】:

我有一个包含 HashMap 的类,并且正在努力将其反序列化回我的类中。下面是这个类的样子......

public class MyClass
{
    public String                   message;
    public String                   category;
    public HashMap<String,String>   customData = new HashMap<String, String>();
    public ArrayList<Device>        devices = new ArrayList<Device>();
}

如果我不注册任何类型的转换器,我会得到以下输出...

{"MyClass": {
  "message": "My Message",
  "category": "My Category",
  "customData": [
    [
      "Name1",
      "Data1"
    ],
    [
      "Name2",
      "Data2"
    ],
    [
      "Name3",
      "Data3"
    ],
    [
      "Name4",
      "Data4"
    ]
  ],
  "devices": [
    {
      "id": 17,
      "firstName": "John",
      "lastName": "Smith",
      "devMode": false
    }
  ]
}}

这看起来很不错,也是我所追求的。但是,当我尝试将其转换回 MyClass 时,我得到一个:

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field customData

所以它不喜欢我的 HashMap 的编码方式。

因此,我查看了各种解决方案,并尝试了使用此转换器提出的解决方案...

https://stackoverflow.com/a/44152959/1790578

然后注册我的转换器...

theXStream.registerConverter (new XStreamMapConverter ());

我编码为 JSON 时得到的输出是...

{"MyClass": {
  "message": "My Message",
  "category": "My Category",
  "customData": [
    "Data1",
    "Data2",
    "Data3",
    "Data4"
  ],
  "devices": [
    {
      "id": 17,
      "firstName": "John",
      "lastName": "Smith",
      "devMode": false
    }
  ]
}}

这显然看起来不正确,因为它正在删除 HashMap 的第一个元素(没有名称)。当我尝试将其从 JSON 转换回 MyClass 时,这当然会导致异常。

所以我尝试使用上面的第一种方式对其进行编码,然后使用转换器对其进行解码。还是同样的问题。

关于我如何处理这个问题有什么想法或见解吗?

更新 1

这是我的带注释的新类...

public class MyClass
{
    public String                   message;
    public String                   category;

    @XStreamImplicit(itemFieldName="name")
    public HashMap<String,String>   customData = new HashMap<String, String>();

    public ArrayList<Device>        devices = new ArrayList<Device>();
}

这根本没有改变我生成的 JSON。我用 NamedMapConverter 进行了尝试,但也没有帮助。但我不确定我的设置是否正确?

NamedMapConverter namedMapConverter = new NamedMapConverter(theXStream.getMapper(),"customData","name",String.class,"value",String.class);
theXStream.registerConverter (namedMapConverter);

【问题讨论】:

  • 不清楚编码适用于何处。

标签: java json hashmap xstream


【解决方案1】:

好的,即使这已经被标记为 -2 我仍然觉得在这里指定解决方案是相关的。

问题是我混合了 JSON 驱动程序。我是 xstream 的长期用户,至少 8 年或更长时间。曾经需要两个不同的驱动程序来编码和解码 json。 JsonHierarchicalStreamDriver 和 JettisonMappedXmlDriver。我不记得这种方式的具体原因,但现在看来,Jettison 驱动程序可以双向使用。很可能一直都是这种情况,但是当向我解释时,我应该使用 JsonHierarchicalStreamDriver 编码为 json 并使用 Jettison 驱动程序进行解码。一旦我更改为 Jettison 驱动程序,一切正常。 HashMap 已正确编码。

所以解决方案,在创建 xstream 时不要混合 json 驱动程序。 JsonHierarchicalStreamDriver 是这里的问题。

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2021-11-13
    • 1970-01-01
    • 2016-06-14
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2013-07-29
    相关资源
    最近更新 更多