json 未使用Gson反序列化时间戳字段

dzjeubhm  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在尝试反序列化一个SQS消息,其消息字段类似于以下内容:

{"Message":"{ObjectId:\"SomeObjectId:SomeVersion:1\",WorkId:\"12345abcdde\",Timestamp:2023-06-18T19:36:43.219Z,MsgFormatVer:1}"}

基本上,我能够得到String Message,但我不能进一步反序列化。
以下是我用来反渲染消息的POJO:

public class EventModel {
    private String Message;
}

public class SQSMessageBody {
    private String ObjectId;
}

这就是代码:

private static final Gson gson = new GsonBuilder().create();

public static <Message> Message getSQSMessage(final String message, final Class<Message> clazz) {
    EventModel eventModel = gson.fromJson(message, EventModel.class);
    return gson.fromJson(eventModel.getMessage(), clazz);
}

SQSMessageBody sqsMessageBody = getSQSMessage(message.getBody(), SQSMessageBody.class);

我不需要时间戳,但它不会被忽略。我也试着用这样的方式构建Gson Builder:

private static final Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-mm-dd'T'HH:mm:ss.SSSZ")
            .create();

我得到以下错误之一:

MalformedJsonException: Unterminated object at line 1 column 137 path $.Timestamp
Unparseable date: "2023-06-18T19"

注意事项:
1.我无法更改SQS消息的结构。
1.我无法在时间戳值中添加引号。
1.没有时间戳字段,它工作正常。

omqzjyyz

omqzjyyz1#

除了@DanielBarbarian在评论中写的内容之外,完整的Message值不是有效的JSON。成员名称(例如ObjectId)被引用,这是JSON要求的。Gson只是碰巧接受了这一点,因为它默认是宽大的。
但如果可能的话,你不应该依赖于这个,因为Gson的这种“宽松模式”没有以任何方式标准化,并且允许所有类型的畸形JSON。因此,如果您将来要切换到不同的JSON库,或者试图将代码移植到另一种编程语言,您将遇到问题。
正确的解决方案可能是找出这个Message值是如何构造的,如果有必要的话,编写自己的解析器。

相关问题