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