Json字符串到HashMap无法反序列化

时间:2015-02-20 07:40:43

标签: java json jackson

{"Messages":[{"KEY01":"VALUE01"}, {"KEY02":"VALUE02"}, {"KEY03":"VALUE03"}]}

这是我的json字符串。我试图将其映射到hashmap。这就是我在做的事情:

messageByLanguage = mapper.readValue(jsonString, MessageByLanguage.class);

这是我的MessageByLanguage类:

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

这就是我得到的错误。有人能告诉我我做错了吗?

2 个答案:

答案 0 :(得分:0)

尝试Google Gson

跟随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]

答案 1 :(得分:0)

问题是您的输入是从字符串到数组的映射,该数组是对象的集合,每个对象都有一个key-&gt;值(至少在您的示例中)。

如果您确实需要这些key-&gt;值对的地图,那么您需要:

  1. 读入整个对象。如果你真的想把它做成一个单独的对象,它就是Map<String,List<Map<String,String>>>,虽然你也可以创建一个处理其中一些对象的对象。
  2. 将数组转换为地图。您自己需要为此编写代码,但这意味着遍历列表并从地图中获取键值对,并将其放入新的Map中。