Java XStream(JSON)HashMap<;字符串,字符串>;解码
我有一个包含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>();
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);