XStream(JSON)HashMap <string,string =“”>解码

时间:2018-02-19 22:36:30

标签: java json hashmap xstream

我有一个包含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的第一个元素(没有Name)。当我尝试将其从JSON转换回MyClass时,这当然会导致异常。

所以我尝试在上面的第一个方法编码它,然后使用Converter解码它。仍然是同一个问题。

关于如何处理此事的任何想法或见解?

更新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);

1 个答案:

答案 0 :(得分:0)

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

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

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