当前位置: 首页 > 知识库问答 >
问题:

Jackson无法将JSON映射到包含映射的对象

聂建茗
2023-03-14
public class Widget {
    private Map<String,Object> params;

    // Getter, setter, ctor, etc...
}
public Widget fromJSON(String json) {
    ObjectMapper jsonMapper = new ObjectMapper();
    return jsonMapper.readValue(json, Widget.class);
}
{
    "params": [{
        "acks": "all"
    }, {
        "retries": 0
    }, {
        "batch.size": 16384
    }, {
        "linger.ms": 1
    }, {
        "buffer.memory": 33554432
    }, {
        "key.serializer": "org.apache.kafka.common.serialization.StringSerializer"
    }, {
        "value.serializer": "org.apache.kafka.common.serialization.StringSerializer"
    }]
}
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance
    of java.util.LinkedHashMap out of START_ARRAY token

我使用http://jsonlint.com来验证JSON是否有效。因此,我要么需要更改JSON或代码,要么可能两者都需要。有什么想法吗?

共有1个答案

隆钊
2023-03-14

JSON是有效的,但对于映射不是。params的值是一个数组,它应该是一个对象,如下所示:

{
    "params": {
        "acks": "all",
        "retries": 0,
        "batch.size": 16384,
        "linger.ms": 1,
        "buffer.memory": 33554432,
        "key.serializer": "org.apache.kafka.common.serialization.StringSerializer",
        "value.serializer": "org.apache.kafka.common.serialization.StringSerializer"
    }
}

在Jackson五分钟,你可以找到以下关系:

Jackson将用于简单数据绑定的具体Java类型有:

╔══════════════════════╦══════════════════════════════╗
║      JSON Type       ║          Java Type           ║
╠══════════════════════╬══════════════════════════════╣
║ object               ║ LinkedHashMap<String,Object> ║
║ array                ║ ArrayList<Object>            ║
║ string               ║ String                       ║
║ number (no fraction) ║ Integer, Long or BigInteger  ║
║ number (fraction)    ║ Double (or BigDecimal)       ║
║ true|false           ║ Boolean                      ║
║ null                 ║ null                         ║
╚══════════════════════╩══════════════════════════════╝
 类似资料:
  • 假设我有这样的物体 我正在使用RestTemboard类从URL中获取json,如下所示: 之后,我想使用jackson对象映射器将json字符串转换为一个对象 将实体类作为第二个参数传递 问题是我应该如何编写ExampleJson实体来处理get-Showed json?我试过这样上课,但似乎不管用。 我得到了这样一个例外:

  • 我使用JAVA jackson将JSON映射到JAVA pojo对象,我的JSON文件是: 在之后,我收到了以下错误消息: 不能反序列化出START_ARRAY令牌 我的POJO课程: 请问,这种JSON格式的正确java POJO是什么?谢谢

  • 我和jackson一起绘制地图,我有点迷茫。我的Json具有以下结构 我确实找到了很多处理数组的教程,但我在第一个标记“d”时就已经失败了。而且根本不需要所有的“_元数据”标记。 我创建了一个包含lastName等属性和一个集合附件的pojo。但我的代码在标记“d”或“_元数据”时总是失败 还有杰克逊的读者 任何提示都将不胜感激。 问候马蒂亚斯

  • 问题内容: 给定这样的结构: 是否可以将其映射到: 这样,您最终获得的实例的属性分别设置为和? 问题答案: 我坚信将您的POJO与外部化分开。将您的JSON读取到Map中,然后像这样构建您的Container / ScoreKeeper对象(对于任何错别字都为apols):

  • 我有一个像这样的json,它嵌套在其中一个字段中- 我创建了一个自定义类, 在我的服务类中,我正在读取json并将其映射到我的EmailTemplate类中,但是映射失败了。这里有什么可以用的? 例外情况: 我试着添加 但这也不起作用。

  • 问题内容: 我正在尝试将JSON文件映射到类对象,然后根据新接收的JSON更新卡。 我的JSON结构是这样的 我的班级看起来像这样: 如何将JSON文件中的值映射到CardInfo类创建的对象的字段中? 更新资料 以下试用版在 ci.description上 打印为null ,是否表示从未创建该对象? 更新2 打印cardInfo给出以下内容: {$ class:FirstCard,id:1,说明