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

如何使用Jackson反序列化对象变量?

吕晟睿
2023-03-14

我有一个Packet类,它可以很好地序列化和反序列化:

@JsonDeserialize(builder = Packet.Builder.class)
public final class Packet {
    // Constructors, getters, etc
    // ...
    public static final class Builder {
        // Builder variables...
        // ...

        @JsonProperty("value_date")
        public Builder valueDate(String val) {
            valueDate = val;
            return this;
        }

        @JsonProperty("generation_date")
        public Builder generationTimeStamp(String val) {
            generationTimeStamp = val;
            return this;
        }

        public Packet build() { return new Packet(this); }
    }

我还有一个< code>PacketResponse对象,类似于:

@JsonDeserialize(builder = PacketResponse.Builder.class)
public final class PacketResponse {

    // Packet and response message
    private final String message;
    private final Packet packet;

    // Constructors, getters, etc
    // ...

    public static final class Builder {

        private Packet packet;
        private String message;

        private Builder() {}

        @JsonProperty("packet")
        public Builder packet(Packet val) {
            packet = val;
            return this;
        }

        @JsonProperty("message")
        public Builder message(String val) {
            message = val;
            return this;
        }

        public PacketResponse build() {
            return new PacketResponse(this);
        }
    }

PacketResponse对象的序列化工作正常,结果如下:

{
    "message": "the quick brown fox",
    "packet": {
        "valueDate": "2015-10-24",
        "generationTimeStamp": "2015-11-12T20:45:24+0000"
    }
}

然而,当我试图将这个JSON反序列化回一个< code>PacketResponse对象时,使用

new ObjectMapper().readValue(json, PacketResponse.class);

我得到一个无法识别的字段“valueDate”(类com.m.Packet$Builder),未标记为可忽略

似乎它正在尝试反序列化 Packet,但由于它没有直接执行此操作,杰克逊看不到 @JsonProperty(“value_date”)注释,而是正在寻找一个 valueDate 字段(因为这是构建器方法的名称)。

有人能帮我找出反序列化JSON的正确方法吗?我对Jackson还是新手,不知道如何解决这个问题。

共有1个答案

林君博
2023-03-14

JSON包含“valueDate”,但@JsonProperty注释指定了“value_date”(带下划线)。

注释中的“generation_date”与JSON中的“生成时间戳”也是如此。

 类似资料:
  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法

  • 问题内容: 在杰克逊的数据绑定的文档表明,杰克逊支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 我有一个JSON,它带有一个包含任意键和值类型的标记,我想将其读入Java中POJO内的映射。映射将是指向JsonValue或JsonNode之类的字符串。我正在使用对象映射器解析json。 有人对如何设置我的POJO来与杰克逊一起完成这一任务有什么建议吗?还是一种更好的方式? Json示例: 映射方法: 我的POJO:

  • 问题内容: 支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co