【问题标题】:Issue when trying to use Jackson in java尝试在 java 中使用 Jackson 时出现问题
【发布时间】:2011-05-22 11:54:30
【问题描述】:

我正在尝试使用 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 tutorial 中让我感到困惑的部分。 new File("user.json") 代表什么?我认为这是我要转换的 json 格式的字符串,这就是我使用 ld 的原因。

希望你能帮帮我

【问题讨论】:

  • 来自 javadoc:注意:如果结果类型是容器(Collection 或 Map),则不应使用此方法。原因是由于类型擦除,key 和 value 类型不能自省使用这种方法。
  • @OrangeDog- 那我应该用什么?

标签: java jackson


【解决方案1】:

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

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

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>>() {});

【讨论】:

  • 谢谢,我试过了: Map lcd = mapper.readValue(dt, new TypeReference>() { }); ,但现在我收到此错误:“org.codehaus.jackson.map.JsonMappingException:无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 的实例”
  • ...或问题中给出的教程。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    它比你想象的要容易。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 2021-06-11
        • 1970-01-01
        • 2011-10-07
        • 2019-06-07
        相关资源
        最近更新 更多