【问题标题】:Unable to find data in DTO from JSON object - parsing error ZonedDateTime无法从 JSON 对象中找到 DTO 中的数据 - 解析错误 ZonedDateTime
【发布时间】:2020-11-24 13:01:57
【问题描述】:

我正在尝试将 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;

更新 DTO

    @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;
    }

}

【问题讨论】:

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

标签: java json jackson dto


【解决方案1】:

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

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

我现在可以返回 200 OK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 2020-07-13
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2016-07-21
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多