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

Jackson坚持在反序列化POJO时抛出令人困惑的异常

公冶同
2023-03-14

我找不到为什么我从Jacksoin得到一个异常,即使一切看起来都很好。

我有以下JSON:

      {
        "id": "8a599509-994a-4cff-ad6d-c3f770e8d159",
        "action": "0",
        "code": "13",
        "device_id": "0BC813D9-37FE-4FAB-9FA0-05F85CBAE777",
        "branch_id": "0BC813D9-37FE-4FAB-9FA0-05F85CBAE999",
        "description": "Sergio sei uno stra-figo",
        "date": "2021-11-09T10:22:45",
        "severity": 1
      }

以及我需要将Json反序列化为:

@JsonIgnorePropenter code hereerties(ignoreUnknown = true)
public class LogMdto {

private String id;

public String getId() {
    return id;
}

@JsonProperty(value = "object_id")
private String objectId;

@Size(max = Log.objectNameSize, message = "size may not by bigger than " + Log.objectNameSize)
@JsonProperty(value = "object_name")
private String objectName;

@JsonProperty("device_id")
private String deviceId;

@NotNull(message = "may not be null")
private String description;

@NotNull(message = "may not be null")
@Size(max = Log.codeSize, 
        message = "size may not by bigger than " + Log.codeSize)
private String code;

private Integer action;

private String id;

private int severity;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss")
private Timestamp date;


public Timestamp getDate() {
    return date;
}

public void setDate(String date) {
    DateTimeFormatter dft = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    this.date = Timestamp.valueOf(LocalDateTime.from(dft.parse(date)));
}

public String getObjectId() {
    return objectId;
}

public void setObjectId(String objectId) {
    this.objectId = objectId;
}

public String getObjectName() {
    return objectName;
}

public void setObjectName(String objectName) {
    this.objectName = objectName;
}

public String getDeviceId() {
    return deviceId;
}

public void setDeviceId(String deviceId) {
    this.deviceId = deviceId;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getCode() {
    return code;
}

public void setCode(String code) {
    this.code = code;
}

public Integer getAction() {
    return action;
}

public void setAction(Integer action) {
    this.action = action;
}

public void setId(String id) {
    this.id = id;
}

public int getSeverity() {
    return severity;
}

public void setSeverity(int severity) {
    this.severity = severity;
}

我不明白为什么这个例外。字段deviceId与@jsonproperty(“device_id”)映射,我有setter和getter,但我仍然是一个错误。

更新

我做了以下更改:

//Removed the annotation
private String deviceId;
@JsonProperty(value = "device_id")
public String getDeviceId() {
    return deviceId;
}

@JsonProperty(value = "device_id")
public void setDeviceId(String deviceId) {
    this.deviceId = deviceId;
}

共有1个答案

蒯硕
2023-03-14

如果我没有弄错的话,因为它是一个私有字段,所以不使用字段@jsonproperty注释本身,而是使用getter/setter。

getter/setter将用于序列化/反序列化,在这两种情况下,它们与device_id名称不匹配;

要修复它:将@jsonproperty添加到getter/setter中。

@JsonProperty("device_id")
public String deviceId;
@JsonIgnoreProperties(ignoreUnknown = true)
public class LogMdto {

    private String id;

    @JsonProperty(value = "object_id")
    private String objectId;

    @JsonProperty(value = "object_name")
    private String objectName;

    private String deviceId;

    @NotNull(message = "may not be null")
    private String description;

    @NotNull(message = "may not be null")
    private String code;

    private Integer action;

    private int severity;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private Timestamp date;


    public String getId() {
        return id;
    }

    public Timestamp getDate() {
        return date;
    }

    public void setDate(String date) {
        DateTimeFormatter dft = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        this.date = Timestamp.valueOf(LocalDateTime.from(dft.parse(date)));
    }

    public String getObjectId() {
        return objectId;
    }

    public void setObjectId(String objectId) {
        this.objectId = objectId;
    }

    public String getObjectName() {
        return objectName;
    }

    public void setObjectName(String objectName) {
        this.objectName = objectName;
    }
    @JsonProperty("device_id")
    public String getDeviceId() {
        return deviceId;
    }
    @JsonProperty("device_id")
    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Integer getAction() {
        return action;
    }

    public void setAction(Integer action) {
        this.action = action;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getSeverity() {
        return severity;
    }

    public void setSeverity(int severity) {
        this.severity = severity;
    }
}
public static void main(String[] args) throws Exception{
    String jsonTest = "{\n" +
            "        \"id\": \"8a599509-994a-4cff-ad6d-c3f770e8d159\",\n" +
            "        \"action\": \"0\",\n" +
            "        \"code\": \"13\",\n" +
            "        \"device_id\": \"0BC813D9-37FE-4FAB-9FA0-05F85CBAE777\",\n" +
            "        \"branch_id\": \"0BC813D9-37FE-4FAB-9FA0-05F85CBAE999\",\n" +
            "        \"description\": \"Sergio sei uno stra-figo\",\n" +
            "        \"date\": \"2021-11-09T10:22:45\",\n" +
            "        \"severity\": 1\n" +
            "      }";

    LogMdto logMdto = new ObjectMapper().readValue(jsonTest, LogMdto.class);

    System.out.println(logMdto.getDeviceId());
}
0BC813D9-37FE-4FAB-9FA0-05F85CBAE777
 类似资料:
  • 我这里有一个代码片段,基本上展示了Dan提到的想法,即提升react中的内容,以自然地提高性能并编写更简洁的代码。在InputField组件中,按钮总是呈现,这不是我想要的行为,它应该跳过呈现按钮组件。所以它应该做的是跳过渲染,因为按钮是inputfield的子道具,如果子道具没有改变,react将跳过渲染。 Dan解释的类似概念示例:“当颜色改变时,ColorPicker重新渲染。但它仍然有上次

  • 我希望类中的方法在IO线程上运行一些代码,但只有一次它们订阅的主题具有特定值。然后调用者应该在AndroidUI线程上得到响应。 像这样的东西: 这有用吗?不确定,所以我写了一组单元测试来检查它们。我发现我的测试方法,尽管它们在一个接一个地运行时总是有效的,但作为套件的一部分会失败。 事实上,我发现如果我把同样的测试进行两次,第一次会通过,但第二次会失败! 为什么会这样?被测类中的bug是,还是测

  • 问题内容: 有人可以向我解释一下吗: 我从不理解,我认真地认为,如果有人不尝试向我深入解释,我永远也不会。这整个上下文使我感到困惑。有时它是这样的: 有时它不会那样工作,但只接受: 有时是: 等等等等等。 我了解上下文的基础,但是有几项?为什么日食会一次又一次地向我抛出错误呢?为什么有时需要声明上下文?: 我无法在所有情况下都找到合适的环境,我怎么知道在每种情况下都合适的环境? 问题答案: 首先,

  • 我尝试反序列化一个巨大的API负载。这个有效负载包含的字段比我需要的要多,因此我正在使用。但是,在某些情况下,反序列化会失败,并显示错误消息: 我找到了解决方案,建议使用 我试过这个。但这于事无补。此外,我的结果数据不是一个单一的值数组。它实际上包含两个值——因此解决方案无论如何都不会相加。 以下是反序列化的目标类。 下面是我测试它的单元测试: 这是我想要反序列化的有效负载

  • 这是我的代码: 我的映射是字符串到整数,那么50是从哪里来的???

  • 我正在创建一个自定义Jackson反序列化器类来将JSON负载映射到一个对象。在我的方法中,我对JSON负载进行了一些检查,以查看是否缺少任何字段或与POJO不一致。 我尝试在方法中抛出异常,方法如下所示: 但是,我不允许在方法中抛出我自己的异常,因为该方法实现了一个接口,我只能抛出和: 在这种情况下,当执行反序列化时,如何验证JSON有效负载?