尝试在java中使用Jackson时出现问题

时间:2010-12-08 21:06:17

标签: java jackson

我正在尝试使用Jackson将一些JSON数据转换为Java对象,这是一个精确的对象列表,但是我收到了这个错误:

org.codehaus.jackson.map.JsonMappingException:无法从START_ARRAY标记中反序列化entitylayer.Detail的实例

这是代码:

 ObjectMapper mapper = new ObjectMapper(); 
 List<Detail> lcd = (List<Detail>) mapper.readValue(ld, Detail.class);

ld 是Json格式的列表,这是让我在jackson tutorial中融入的部分。 新文件(“user.json”)代表什么?我假设那是我想要转换的json格式的字符串,这就是我使用 ld 的原因。

我希望你可以帮我解决它

4 个答案:

答案 0 :(得分:19)

从您链接的教程(其他收藏集以相同的方式工作):

  

因此,如果您想将数据绑定到Map中,则需要使用:

Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
     

其中TypeReference仅需要传递泛型类型定义(在这种情况下通过任何内部类):重要的部分是&gt;它定义了要绑定的类型。

     

如果你不这样做(并且只是传递Map.class),则调用等同于绑定到Map(即“无类型”Map),如上所述。

编辑:

如果你坚持要用汤匙喂食:

List<Detail> lcd = mapper.readValue(ld, new TypeReference<List<Detail>>() {});

答案 1 :(得分:12)

作为替代策略,处理数组稍微方便一些,因为您可以轻松指定类型。所以,你也可以这样做:

Detail[] details = mapper.readValue(ld, Detail[].class);

阵列通常未被充分利用,至少在与杰克逊打交道时。只要您不必过多地修改结果,它们就可以非常方便地使用,因为类型很好地包含在内而不需要使用泛型(因此,类型安全性很强;它不仅仅是编译器的漏洞)。 p>

答案 2 :(得分:0)

或者自己解析JSON并创建您想要创建的任何POJO。 我这样做是为了将JSON转换为JAXB。

请参阅http://wiki.fasterxml.com/JacksonInFiveMinutes

上的“Streaming API示例”部分

它比你想象的要容易。

答案 3 :(得分:0)

每当出现此错误时,请首先检查您尝试转换为的JSON字符串是否为正确的JSON字符串。如果您尝试创建自己的JSON字符串以便对本地代码进行测试,那么您最终会收到此错误。