gpt4 book ai didi

java - 使用 Gson 解析 MongoDB 中的日期

转载 作者:行者123 更新时间:2023-11-30 03:14:26 24 4
gpt4 key购买 nike

在我的 MongoDB 中,文档如下所示:

{ 
"_id" : ObjectId("5613700bc00eac21886b6a51"),
"firstname" : "Marc",
"lastname" : "Anonymous",
"email" : "marc.XXXXXX@hotmail.com",
"phone" : "+41/12/345678",
"timestamp" : ISODate("2015-10-06T06:54:03.905+0000"),
"state" : "waiting"
}

我正在使用 gson 将 json 解析到我的 Java 类 User 中,该类具有可变时间戳并且是日期,但出现以下错误:

由以下原因引起:java.lang.IllegalStateException:需要一个字符串,但在第 1 行第 179 列路径 $.timestamp 处为 BEGIN_OBJECT

我也通过日期将时间戳插入 MongoDb 中。我不知道如何处理这个问题。我应该只使用字符串并在每次需要时将其转换为日期形式吗?

public class User {

public String firstname;
public String lastname;
public String email;
public String phone;
public Date timestamp;
public String state;

public Date getTimestamp() {
return timestamp;
}

public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
//...

编辑

我通过 MongoDb Java 驱动程序获取 json。当我想用gson反序列化字符串时出现错误

public ArrayList<User> findUserByEmail(String email) {
Gson g = new Gson();
ArrayList<User> l = new ArrayList<>();
MongoDatabase db = con.getDatabase("waitinglist");
MongoCollection col = db.getCollection("users");

MongoCursor<Document> f = col.find(eq("email", email)).iterator();
while (f.hasNext()) {
Document d = f.next();
System.out.println(d.toJson());
l.add(g.fromJson(d.toJson(), User.class));
}
return l;
}

d.toJson() 返回

{
"_id": {
"$oid": "5613700bc00eac21886b6a51"
},
"firstname": "Marc",
"lastname": "xxxx",
"email": "marc.xxxxxx@hotmail.com",
"phone": "+41/12/345678",
"timestamp": {
"$date": 1444114443905
},
"state": "waiting"
}

抛出错误是因为日期被转换成自己的文档,当我想用​​ Gson 反序列化它时,Json 不适合我的类。

最佳答案

您可以使用 Jongo 来解决此问题并将您的代码更改为以下内容:

public ArrayList<User> findUserByEmail(String email) {
Gson g = new Gson();
ArrayList<User> l = new ArrayList<>();
Jongo jongo = con.getDB("waitinglist");

Iterator<User> users = jongo.getCollection("users").find("{email: #}", email).as(User.class).iterator();
while(users.hasNext()){
l.add(users.next());
}
return l;
}

否则你将不得不执行以下操作...

创建一个像这样的包装类

public static class GsonCompatibleDate {
@SerializedName("$date")
public Long date;

public GsonCompatibleDate(Long date) {
this.date = date;
}

public Date getDate() {
return new Date(date);
}

public void setDate(Date date) {
this.date = date.getTime();
}
}
  • 注意注释@SerializedName("$date")。这只是让您可以为变量使用更好的 Java 风格名称;

将您的 POJO 更新为以下内容或类似内容:

public class User {

public String firstname;
public String lastname;
public String email;
public String phone;
public GsonCompatibleDate timestamp;
public String state;

public Date getTimestamp() {
return timestamp.getDate();
}
}

您的反序列化代码将与以前完全相同。更新后的 POJO 现在与您的 Mongo JSON 输出匹配。

我测试了这两种方法,它们对我有用。我还强烈建议使用 Jongo、Morphia 等库...而不是使用 Mongo 驱动程序本身,除非绝对必要。

关于java - 使用 Gson 解析 MongoDB 中的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com