【问题标题】:mongodb java deserialize long using gsonmongodb java使用gson反序列化long
【发布时间】:2023-03-23 22:53:01
【问题描述】:

我可以使用 gson 将包含 long 字段的 POJO 正确插入到 mongodb 服务器。

但是当我使用 Gson 将它反序列化回 pojo 时,我得到了这个错误:

javax.servlet.ServletException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 171 path $.sentTime
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 171 path $.sentTime
java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 171 path $.sentTime

我的 mongo db 文档如下所示:

{
    "_id" : ObjectId("57ff7c30385bb63b1c185b8e"),
    "chatId" : "57f95e8e385bb61c5cf2cd18",
    "sender" : "57ec1aaa0ffe16123439d52b",
    "message" : "Hello Again",
    "sentTime" : NumberLong("1476361264229")
}

POJO:

public class MessageSingle implements Message {

private ObjectId id;
private String chatId;
private String sender;
private String message;
private MessageType messageType;
private long sentTime;

@Override
public ObjectId getId() {
    return id;
}

@Override
public void setId(ObjectId id) {
    this.id = id;
}

@Override
public String getChatId() {
    return chatId;
}

@Override
public void setChatId(String chatId) {
    this.chatId = chatId;
}

@Override
public void setSender(String sender) {
    this.sender=sender;
}

@Override
public String getSender() {
    return sender;
}

@Override
public void setMessage(String message) {
    this.message=message;
}

@Override
public String getMessage() {
    return message;
}

@Override
public void setMessageType(MessageType messageType) {
    this.messageType=messageType;
}

@Override
public MessageType getMessageType() {
    return messageType;
}

@Override
public void setSentTime(long time) {
    this.sentTime=time;
}

@Override
public long getSentTime() {
    return sentTime;
}
}

当我将 long 更改为 int 或 string 时,它运行良好,但不适用于 long。 我该如何解决。 谢谢

【问题讨论】:

    标签: java mongodb gson deserialization mongodb-java


    【解决方案1】:

    似乎 Mongo 对待NumberLong as an object that is handled internally。我相信您将不得不使用 TypeAdapter,如 SO answer 中所述。

    另一种方法是读取为字符串并进行转换,但我认为它是最后的资源

    【讨论】:

      【解决方案2】:
      JsonWriterSettings relaxed = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build();
      System.out.println("output = " + doc.toJson(relaxed));
      

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 2017-01-27
        相关资源
        最近更新 更多