Json 字符串到 HashMap 无法反序列化
Json string to HashMap can not deserialize
{"Messages":[{"KEY01":"VALUE01"}, {"KEY02":"VALUE02"}, {"KEY03":"VALUE03"}]}
这是我的 json 字符串。我试图将它映射到 hashmap。这就是我在做的事情:
messageByLanguage = mapper.readValue(jsonString, MessageByLanguage.class);
这是我的 MessageByLanguage class:
public class MessageByLanguage {
@JsonProperty("Messages")
private Map<String, String> messages = new HashMap<String, String>();
public MessageByLanguage (){};
public void setMessages(Map<String, String> messages) {
this.messages = messages;
}
public Map<String, String> getMessages() {
return messages;
}
can not deserialize instance of java util linkedhashmap out of start_array token
这就是我收到的错误。有人可以告诉我我做错了什么吗?
关注Json
String json="{\"Messages\":[{\"KEY01\":\"VALUE01\"}, {\"KEY02\":\"VALUE02\"}, {\"KEY03\":\"VALUE03\"}]}";
您需要以这种方式修改您的解析
Gson gson=new Gson();
Map<String,Map<String,String>> map=new HashMap<String,Map<String,String>>();
map=(Map<String,Map<String,String>>) gson.fromJson(json, map.getClass());
System.out.println(map.keySet());
System.out.println(map.values());
现在输出
[Messages] //Key in String
[[{KEY01=VALUE01}, {KEY02=VALUE02}, {KEY03=VALUE03}]] // Value in Map<String,String>
现在获取消息的一组实际键和值
这样迭代
for(Map.Entry<String,Map<String,String>>entry:map.entrySet()){
ArrayList<Map<String,String>>list=(ArrayList<Map<String, String>>) entry.getValue();
for(Map<String,String>innerMap:list){
System.out.print(innerMap.keySet()+"\t");
System.out.println(innerMap.values());
}
}
你的最终输出
[KEY01] [VALUE01]
[KEY02] [VALUE02]
[KEY03] [VALUE03]
问题是您的输入是从字符串到数组的映射,而该数组是对象的集合,每个对象都有一个键->值(至少在您的示例中)。
如果您确实需要这些键->值对的映射,那么您将需要:
- 读入整个对象。如果你真的想把它作为一个单独的对象来做,它是一个
Map<String,List<Map<String,String>>>
,尽管你也可以创建一个对象来处理其中的一些。
- 将数组转换为地图。您需要自己为此编写代码,但这意味着遍历列表并从映射中获取键值对并将其放入新映射中。
{"Messages":[{"KEY01":"VALUE01"}, {"KEY02":"VALUE02"}, {"KEY03":"VALUE03"}]}
这是我的 json 字符串。我试图将它映射到 hashmap。这就是我在做的事情:
messageByLanguage = mapper.readValue(jsonString, MessageByLanguage.class);
这是我的 MessageByLanguage class:
public class MessageByLanguage {
@JsonProperty("Messages")
private Map<String, String> messages = new HashMap<String, String>();
public MessageByLanguage (){};
public void setMessages(Map<String, String> messages) {
this.messages = messages;
}
public Map<String, String> getMessages() {
return messages;
}
can not deserialize instance of java util linkedhashmap out of start_array token
这就是我收到的错误。有人可以告诉我我做错了什么吗?
关注Json
String json="{\"Messages\":[{\"KEY01\":\"VALUE01\"}, {\"KEY02\":\"VALUE02\"}, {\"KEY03\":\"VALUE03\"}]}";
您需要以这种方式修改您的解析
Gson gson=new Gson();
Map<String,Map<String,String>> map=new HashMap<String,Map<String,String>>();
map=(Map<String,Map<String,String>>) gson.fromJson(json, map.getClass());
System.out.println(map.keySet());
System.out.println(map.values());
现在输出
[Messages] //Key in String
[[{KEY01=VALUE01}, {KEY02=VALUE02}, {KEY03=VALUE03}]] // Value in Map<String,String>
现在获取消息的一组实际键和值
这样迭代
for(Map.Entry<String,Map<String,String>>entry:map.entrySet()){
ArrayList<Map<String,String>>list=(ArrayList<Map<String, String>>) entry.getValue();
for(Map<String,String>innerMap:list){
System.out.print(innerMap.keySet()+"\t");
System.out.println(innerMap.values());
}
}
你的最终输出
[KEY01] [VALUE01]
[KEY02] [VALUE02]
[KEY03] [VALUE03]
问题是您的输入是从字符串到数组的映射,而该数组是对象的集合,每个对象都有一个键->值(至少在您的示例中)。
如果您确实需要这些键->值对的映射,那么您将需要:
- 读入整个对象。如果你真的想把它作为一个单独的对象来做,它是一个
Map<String,List<Map<String,String>>>
,尽管你也可以创建一个对象来处理其中的一些。 - 将数组转换为地图。您需要自己为此编写代码,但这意味着遍历列表并从映射中获取键值对并将其放入新映射中。