将Java Jackson解析的JSON转换为Map<String, String>

3

我需要将JSON解析出来的map传递给具有以下签名的某个方法:

QUEUE.sendMsg(Map<String, String> data);

很不幸,我无法控制以上方法,Jackson会将解析好的JSON以Map<String, Object>的形式提供给我。

我需要一个Map<String, String>,其中:

  1. 对于原始的JSON类型,我希望其toString()方法返回转换后的值,而非Integer、Long和Boolean等。
  2. 对于复杂的JSON类型,例如List/Map,在字符串中保留原生的JSON格式。

例如,如果JSON输入为:

{
  "name" = "John",
  "marked" = false,
  "age" = 30,
  "tags" = [ "work", "personal" ],
  "meta" = { "k1" : "v1", "k2" : "v2" },
}

我需要一个具有 Map<String, String> 的实例。
map.get("name") returns "John",
map.get("marked") returns "false",
map.get("age") returns "30",
map.get("tags") returns "[ \"work\", \"personal\" ]",
map.get("meta") returns "{ \"k1\" : \"v1\", \"k2\" : \"v2\" }"

有没有实现这个目标的方法呢?

很不幸,我几乎是Java的新手,并且没有关于Jackson的先前知识(我必须使用Jackson来解决这个问题)。

谢谢。


2
为什么您想将整个JSON对象作为字符串返回(包括键、标签和元数据)? - Marek Sebera
3个回答

2
是的,只要确保传递完整的类型信息,隐式转换就应该可以正常工作。因此,代码应该像这样写:

是的,只要确保传递完整的类型信息,隐式转换就应该可以正常工作。因此,代码应该像这样写:

Map<String,String> map = mapper.readValue(jsonSource, new TypeReference<Map<String,String>>() { });

我认为这是正确的答案。 - j.karlsson

0

我认为你正在寻找keyAs。请查看Jackson文档以获取更多详细信息。


0

类似这样的代码应该可以运行...

final Map<String, Object> input = ...;
final Map<String, String> output = new Map<>(input.size());
final StringWriter writer = new StringWriter();
final StringBuffer buf = writer.getBuffer();
for (final Map.Entry<String, Object> entry : input.entrySet()) {
  try (final JsonGenerator gen = JsonFactory.createJsonGenerator(writer)) {
    gen.writeObject(entry.getValue());
  }
  output.put(entry.getKey(), buf.toString());
  buf.setLength(0);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接