用 Gson 解析这个奇怪的嵌套 hashmap
Parsing this weird nested hashmap with Gson
我有一个包含以下字段的对象,我正在尝试对其进行解析,来自网络服务:
private String serviceGroup;
private String serviceDefinition;
private List<String> interfaces = new ArrayList<>();
private Map<String, String> serviceMetadata = new HashMap<>();
出于某种原因,json 的对象格式如下:
"service": {
"interfaces": [
"json"
],
"serviceDefinition": "IndoorTemperature",
"serviceGroup": "Temperature",
"serviceMetadata": {
"entry": [
{
"key": "security",
"value": "token"
},
{
"key": "unit",
"value": "celsius"
}
]
}
}
这里多余的、不需要的部分是 serviceMetadata Hashmap 中的 "entry" 数组。因此,当我尝试使用 Gson.fromJson(theString, myclass.class)
将 json 解析为我的对象时,我得到了 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY
异常。我可以做什么来解析哈希图?
顺便说一下,网络服务使用 moxy 来编组对象。
您将 serviceMetadata
定义为 new HashMap<String, String>()
但应该是Map of lists of objects
您的密钥是 entry
,列表是:
[{
"key": "security",
"value": "token"
}, {
"key": "unit",
"value": "celsius"
}]
所以解决方案是 - 创建一些 class Entry
:
public class Entry{
private String key;
private String value;
}
现在:
private Map<String, List<Entry>> serviceMetadata = new HashMap<>();
我有一个包含以下字段的对象,我正在尝试对其进行解析,来自网络服务:
private String serviceGroup;
private String serviceDefinition;
private List<String> interfaces = new ArrayList<>();
private Map<String, String> serviceMetadata = new HashMap<>();
出于某种原因,json 的对象格式如下:
"service": {
"interfaces": [
"json"
],
"serviceDefinition": "IndoorTemperature",
"serviceGroup": "Temperature",
"serviceMetadata": {
"entry": [
{
"key": "security",
"value": "token"
},
{
"key": "unit",
"value": "celsius"
}
]
}
}
这里多余的、不需要的部分是 serviceMetadata Hashmap 中的 "entry" 数组。因此,当我尝试使用 Gson.fromJson(theString, myclass.class)
将 json 解析为我的对象时,我得到了 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY
异常。我可以做什么来解析哈希图?
顺便说一下,网络服务使用 moxy 来编组对象。
您将 serviceMetadata
定义为 new HashMap<String, String>()
但应该是Map of lists of objects
您的密钥是 entry
,列表是:
[{
"key": "security",
"value": "token"
}, {
"key": "unit",
"value": "celsius"
}]
所以解决方案是 - 创建一些 class Entry
:
public class Entry{
private String key;
private String value;
}
现在:
private Map<String, List<Entry>> serviceMetadata = new HashMap<>();