Java 无法从JSON对象在DTO中找到数据-分析错误ZoneDateTime

Java 无法从JSON对象在DTO中找到数据-分析错误ZoneDateTime,java,json,jackson,dto,Java,Json,Jackson,Dto,我正在尝试将JSON时间戳对象转换为Java 我研究过将JSON字符串转换为java,但不确定我在寻找什么。 如果JSON使用数组,我可以让它工作,但不幸的是,它没有使用这种方法 JSON有效负载 { "type": "RFID-read", "event": { "id": "3892fec6-9246-4699-ba86-99ab1df369a9", "ti

我正在尝试将JSON时间戳对象转换为Java

我研究过将JSON字符串转换为java,但不确定我在寻找什么。 如果JSON使用数组,我可以让它工作,但不幸的是,它没有使用这种方法

JSON有效负载

{
  "type": "RFID-read",
  "event": {
    "id": "3892fec6-9246-4699-ba86-99ab1df369a9",
    "timestamp": "2020-11-19T15:01:11.391+0000",
    "deviceId": "FX9600FB2D21",
    "data": {
      "format": "epc",
      "id": "000000000000000000000115",
      "reads": 1,
      "rssi": -72,
      "antennaId": "1"
    }
  },
  "analytics": {
    "tenant": "73876942a20c12550f996b2152e5ca9e",
    "resourceId": "000000000000000000000115",
    "location": "FX9600FB2D21",
    "timestamp": "2020-11-19T15:01:11.391+0000",
    "meta": {
      "type": "inventory"
    }
  }
}
事件DTO

@Data
@Builder(toBuilder = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ZebraEventReadsDto {

private String id;
private ZonedDateTime timestamp;
@NotNull
@Size(min = 1, max = 100)
private String deviceId;
private String format;
ZebraDataReadsDto data;
    @Data
@Builder(toBuilder = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ZebraLocationUpdateDto {

    private String type;
    ZebraEventReadsDto event;

    public static List<LocationUpdateDom> toDomainModel(ZebraLocationUpdateDto zebraLocationUpdateDto) {
        List<LocationUpdateDom> locationUpdateDomList = new ArrayList<>();

        locationUpdateDomList.add(LocationUpdateDom.builder()
                .deviceName(zebraLocationUpdateDto.zebraEventReadsDto.getDeviceId())
                .dateTime(zebraLocationUpdateDto.zebraEventReadsDto.getTimestamp())
                              
                .tagId(zebraLocationUpdateDto.zebraEventReadsDto.data.getId())

                .latLng(Optional.empty())
                .build());

        return locationUpdateDomList;
    }

}
更新DTO

@Data
@Builder(toBuilder = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ZebraEventReadsDto {

private String id;
private ZonedDateTime timestamp;
@NotNull
@Size(min = 1, max = 100)
private String deviceId;
private String format;
ZebraDataReadsDto data;
    @Data
@Builder(toBuilder = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ZebraLocationUpdateDto {

    private String type;
    ZebraEventReadsDto event;

    public static List<LocationUpdateDom> toDomainModel(ZebraLocationUpdateDto zebraLocationUpdateDto) {
        List<LocationUpdateDom> locationUpdateDomList = new ArrayList<>();

        locationUpdateDomList.add(LocationUpdateDom.builder()
                .deviceName(zebraLocationUpdateDto.zebraEventReadsDto.getDeviceId())
                .dateTime(zebraLocationUpdateDto.zebraEventReadsDto.getTimestamp())
                              
                .tagId(zebraLocationUpdateDto.zebraEventReadsDto.data.getId())

                .latLng(Optional.empty())
                .build());

        return locationUpdateDomList;
    }

}
@数据
@生成器(toBuilder=true)
@JsonInclude(JsonInclude.Include.NON_NULL)
公共类ZebraLocationUpdateDto{
私有字符串类型;
ZebraEventReadsTo事件;
域模型的公共静态列表(ZebraLocationUpdateDto ZebraLocationUpdateDto){
List LocationUpdateDomainList=new ArrayList();
locationUpdateDomainList.add(LocationUpdateDom.builder())
.deviceName(zebraLocationUpdateDto.ZebraEventReadsTo.getDeviceId())
.dateTime(zebraLocationUpdateDto.ZebraEventReadsTo.getTimestamp())
.tagId(zebraLocationUpdateDto.ZebraEventReadsTo.data.getId())
.latLng(可选.empty())
.build());
返回位置UpdateDomainList;
}
}

为了解决解析错误,我在timestamp变量上方使用了以下注释

@JSONFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
private ZonedDateTime timestamp;

我现在可以返回200 OK

根据JSON,
EventDTO
应该包含
DataDTO
作为一个字段,否?@daniu你可能是对的,但我会继续合并id:from数据,因为它会与id:from事件冲突?只需添加一个名为“data”的字段属于您的
EventDTO
类的
DataDTO
类型。@daniu我意识到我在更新dto时将dto对象命名错误。重命名为事件。现在,我的timestamp变量出现解析错误。JSON分析错误:无法从字符串\“2020-11-19T15:01:11.391+0000\”@AlexBingham中反序列化类型为
java.time.ZonedDateTime
的值,该字符串不是
java.time.ZonedDateTime
,因为没有时区信息。它只是一个
java.time.OffsetDateTime
格式:
yyyy-MM-dd'T'HH:MM:ss.SSSZ
,不是默认格式。所以我建议将类型更改为“java.time.OffsetDateTime”,并显式定义格式。