2

我需要将 JSON 解析的映射传递到具有以下签名的某个方法中:

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

不幸的是,我无法控制上述方法,杰克逊给了我在Map<String, Object>.

我需要一个Map<String, String>地方

  1. 对于原始 JSON 类型,而不是 Integer、Long、Boolean,我想要它的 toString() 转换值。
  2. 对于 List/Map 等复杂的 JSON 类型,将结果以原生 JSON 格式存储在 String 中。

例如,如果 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 来解决这个问题)。

谢谢你。

4

3 回答 3

1

是的,只要您确保传递 FULL 类型信息,隐式转换就应该起作用。所以像:

Map<String,String> map = mapper.readValue(jsonSource, new TypeReference<Map<String,String>>() { });
于 2012-09-10T17:29:24.173 回答
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);
}
于 2012-09-09T08:02:54.520 回答
0

我想你正在寻找keyAs. 请查看杰克逊文档以获取更多详细信息

于 2012-09-09T08:36:00.373 回答