我有一个包含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);
答案 0 :(得分:0)
好的,即使已经标记为-2,我仍然认为指定解决方案在这里是相关的。
问题是我正在混合使用JSON驱动程序。我是xstream用户的长期至少8年或更长时间。曾经有一段时间需要两个不同的驱动程序来编码和解码json。 JsonHierarchicalStreamDriver和JettisonMappedXmlDriver。我不记得这种方式的具体原因,但看起来Jettison驱动程序现在可以两种方式使用。它可能一直都是这样,但当我向我解释时,我应该使用JsonHierarchicalStreamDriver对json进行编码,使用Jettison驱动程序进行解码。一旦我改为Jettison驱动程序,一切都运转了。 HashMap已正确编码。
所以解决方案是,在创建xstream时不要混用json驱动程序。 JsonHierarchicalStreamDriver就是这里的问题。