19

我正在尝试使用 Jackson 将一些 JSON 数据转换为 Java 对象,准确地说是对象列表,但我收到此错误:

org.codehaus.jackson.map.JsonMappingException:无法反序列化 entitylayer.Detail 的实例,超出 START_ARRAY 令牌

这是代码:

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

ld是 Json 格式的列表,这是让我在jackson 教程中感到困惑的部分。new File("user.json")代表什么?我认为这是我想要转换的 json 格式的字符串,这就是我使用ld的原因。

我希望你能帮我解决这个问题

4

4 回答 4

19

从您链接的教程中(其他集合的工作方式相同):

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

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

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

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

编辑:

如果你坚持用勺子喂:

List<Detail> lcd = mapper.readValue(ld, new TypeReference<List<Detail>>() {});
于 2010-12-08T21:43:07.723 回答
12

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

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

数组经常未被充分利用,至少在与杰克逊打交道时是这样。只要您不必过多地修改结果,它们就非常方便使用,因为类型被很好地包含而无需使用泛型(因此,类型安全性很强;它不仅仅是编译器的绒毛)。

于 2010-12-10T18:51:02.583 回答
0

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

请参阅http://wiki.fasterxml.com/JacksonInFiveMinutes上的“流 API 示例”部分

它比您预期的要容易。

于 2013-02-08T09:15:01.367 回答
0

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

于 2013-06-13T07:14:10.953 回答