Jackson ObjectMapper使用Json字符串键反序列化Map

时间:2019-06-18 07:52:40

标签: java json jackson

任务是创建正确的Json字符串表示形式。有Map可能包含那个Json字符串的值。在写此映射到字符串映射器时,请转义新行并引用Json。

private String getJson() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    Map<String, String> map = new HashMap<>();
    map.put("key1", "val1");
    map.put("key2", "val2");
    return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
}

返回:

{
  "key1" : "val1",
  "key2" : "val2"
}

代码

public String test() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    Map<String, String> map = new HashMap<>();
    map.put("information", getJson());
    String result = mapper.writeValueAsString(map);
    System.out.println(result);
    return result; 
}

返回

{"information":"{\r\n  \"key1\" : \"val1\",\r\n  \"key2\" : \"val2\"\r\n}"}

但是test()方法是否可以像这样返回String:

{
  "information": {
    "key1": "val1",
    "key2": "val2"
  }
}

谢谢

2 个答案:

答案 0 :(得分:0)

控制台输出中的问题。地图的值是字符串。如果要压缩输出,则可以在地图中使用键“信息”将“ key1”,“ key2”与地图放在一起,然后调用mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map)

答案 1 :(得分:0)

您必须先将JSON转换回地图,然后再将其放入“信息”地图。在您的代码中,它被视为字符串而不是映射。 因此,您必须将test()方法更新为以下内容:

public static String test() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    TypeReference<HashMap<String, String>> typeRef = new TypeReference<HashMap<String, String>>() {};
    Map<String, String> oldMap = mapper.readValue(getJson(), typeRef);

    Map<String, Map<String, String>> map = new HashMap<>();
    map.put("information", oldMap);

    String result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
    System.out.println(result);
    return result; 
}

输出点是

{
  "information" : {
    "key1" : "val1",
    "key2" : "val2"
  }
}