2013-11-20 62 views
1

我有一个JSON对象有两个属性:“key”是一个字符串,“value”可以被反序列化成一个Java bean。使用杰克逊反序列化到一个映射

{ "key": "foo", "value": "bar" } 

问题是,给定一个这样的对象的列表,我可以反序列化成一个Map吗?

[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String> 

目前使用杰克逊,数据绑定2.1

+0

请完全解决您的问题。哪里有问题。一个人看不到你想要做什么。 – Lion

+0

基本上,您希望将数据的属性列表/ XML安排转换为更简单的形式,其中“键”和“值”条款将被删除,以便您获得“{”foo1“:”bar1“,”foo2“ :“bar2”,...}'。这可以通过外部数组的简单循环来完成,但是我已经(在Objective-C中)看到了其他“聪明”(尽管不一定更清洁或更高效)的方式来做到这一点。除非你是为了刺激精神,否则我会建议简单的循环。 (如果它不明显,使用Jackson或其他任何工具转换成地图列表,然后遍历列表以构建新地图。) –

回答

4

您可以轻松地转换上述JSON到List<Map<String, String>>

import java.util.List; 
import java.util.Map; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.type.CollectionType; 

public class JacksonProgram { 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = new ObjectMapper(); 
     CollectionType mapCollectionType = mapper.getTypeFactory().constructCollectionType(List.class, Map.class); 
     List<Map<String, String>> result = mapper.readValue(json, mapCollectionType); 
     System.out.println(result); 
    } 
} 

上面的程序打印:

[{key=foo1, value=bar1}, {key=foo2, value=bar2}] 
+3

这不是他想要的。 –

1

因为你的结构不匹配,你有两个基本选项:

  1. 使用两阶段处理:用杰克逊结合成中间表示的是确实匹配(其可以是JsonNodeList<Map<String,Object>>),然后执行转换成所需类型的简单代码
  2. 写自定义序列和/或解串器

杰克逊不支持广泛的结构转换(有一些简单的转换,如@JsonUnwrapped),所以这种功能不太可能被添加到数据绑定模块。虽然它可以作为扩展模块添加,但如果这些“智能地图”类型的结构是常用的(他们似乎是,不幸)。