Java Jackson JSON解析为Map <string,string =“”> </string,>

时间:2012-09-09 07:53:56

标签: java json jackson

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

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

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

我需要Map<String, String>其中

  1. 对于原始JSON类型,而不是Integer,Long,Boolean,我想要它的toString()转换值。
  2. 对于复杂的JSON类型(如List / Map),将结果以本机JSON格式存储在String中。
  3. 例如,如果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来解决这个问题)。

    谢谢。

3 个答案:

答案 0 :(得分:1)

是的,只要您确保传递完整类型信息,隐式转换就应该有效。如下所示:

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

我认为您正在寻找keyAs。有关详细信息,请查看Jackson Documentation