Java XStream(JSON)HashMap<;字符串,字符串>;解码

Java XStream(JSON)HashMap<;字符串,字符串>;解码,java,json,hashmap,xstream,Java,Json,Hashmap,Xstream,我有一个包含HashMap的类,正在努力将其反序列化回我的类中。这是这门课的样子 public class MyClass { public String message; public String category; public HashMap<String,String> customData = new HashMap<String, String>();

我有一个包含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时,我得到一个:

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field customData
所以它不喜欢我的HashMap的编码方式

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

然后注册我的转换器

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>();
}

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

问题是我混合了JSON驱动程序。我是xstream的长期用户,至少有8年或更长时间。曾经有一段时间,编码和解码json需要两个不同的驱动程序。JSONHierarchycalStreamDriver和JettisonMappedXmlDriver。我不记得以前这种方式的具体原因了,但现在看来抛弃驱动程序可以双向使用了。很可能一直都是这样,但当向我解释时,我应该使用JSONHierarchycalStreamDriver编码为json,使用抛弃驱动程序解码。有一次,我换成了弃置司机,因为这两种方法都奏效了。哈希映射已正确编码


因此,解决方案是,在创建xstream时不要混合使用json驱动程序。JSONHierarchycalStreamDriver是这里的问题。

不清楚编码在哪里应用。
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>();
}
NamedMapConverter namedMapConverter = new NamedMapConverter(theXStream.getMapper(),"customData","name",String.class,"value",String.class);
theXStream.registerConverter (namedMapConverter);