2012-09-09 141 views
2

我需要通过JSON解析地图分成一些方法,该方法具有以下特征:爪哇杰克逊JSON解析成地图<字符串,字符串>

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

不幸的是,我对上述方法无控制,和Jackson给出我在Map<String, Object>中解析了JSON。

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

  1. 的原始JSON类型,而不是为Integer,Long,布尔的,我想它的toString()转换值。
  2. 为复杂的JSON类型,如列表/地图,将结果保存在本地的字符串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,并具有杰克逊(我不得不使用杰克逊这个解决方案)的先验知识。

谢谢。

+2

为什么你想返回整个JSON对象作为字符串(键标签,元)? –

回答

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); 
} 
1

是,隐式转换应该只要你确保你通过完整的类型信息的工作。所以像这样:

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