【发布时间】: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);
【问题讨论】:
-
不清楚编码适用于何处。