新Gson()。toJson(新ObjectId())
当我执行上述操作时,我得到的输出是
“_id”:{“_time”:1374347520,“_machine”:-1025067326,“_inc”:585905201,“_new”:false}
但事实上我希望它像
_id:{$id:51eae100c2e6b6c222ec3431}
这是常见的mongodb ID格式。Java中更可取的方法是什么?
更新:
我的价值目标
import com.google.gson.annotations.SerializedName;
import org.bson.types.ObjectId;
public class TaskObject {
@SerializedName("_id")
private ObjectId _id;
@SerializedName("revNo")
private int revNo;
}
我正试图用一个自定义id将其存储到mongodb
TaskObject taskObject = new TaskObject();
taskObject.set_id(new ObjectId());
TaskMongoDBClient.getInstance().
persistNewTaskData(new Gson().toJson(taskObject));
mongodb中存储的内容如下所示。
_id:{“_time”:1397464341,“_machine”:1441187434,“_inc”:-1687457948,“_new”:true}
而不是_id:{"$id": xxxx},我可以通过使用id值来查询。
我做错了什么?请帮忙。
谢谢
至少有两种方法可以做到这一点。最正确的方法可能是使用GSON TypeAdapter来配置ObjectId如何写入(和读取)JSON。您需要创建一些实现TypeAdapter
的东西,并将其注册到GsonBuilder
,这样GSON就知道有一种处理objectid的特殊方法。
使用
@Test
public void shouldWriteCorrectJSON() {
// given
TaskObject taskObject = new TaskObject();
taskObject._id = new ObjectId("51eae100c2e6b6c222ec3431");
Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).create();
// when
String gsonString = gson.toJson(taskObject);
// then
assertThat(gsonString, is("{\"_id\":{\"$oid\":\"51eae100c2e6b6c222ec3431\"}}"));
}
private class ObjectIdTypeAdapter extends TypeAdapter<ObjectId> {
@Override
public void write(final JsonWriter out, final ObjectId value) throws IOException {
out.beginObject()
.name("$oid")
.value(value.toString())
.endObject();
}
@Override
public ObjectId read(final JsonReader in) throws IOException {
in.beginObject();
assert "$oid".equals(in.nextName());
String objectId = in.nextString();
in.endObject();
return new ObjectId(objectId);
}
}
请注意,测试断言JSON看起来像你想要的那样,我必须创建一个ObjectIdTypeAdapter
,它知道ObjectId的字段名是"$id",并且该值只是ObjectID的字符串值,并且不会单独序列化所有字段。
还要注意,如果更改对象写入JSON的方式,还需要更改读取它的方式。因此,我还实现了read
来检查字段名是否正确(如果字段名不正确,您可能应该在这里抛出一个异常,而不是使用简单的断言),然后读取值并从这个字符串值创建ObjectId。
在现实生活中,您可能也希望在这两种情况下检查空值。
因为我是一个负责任的程序员,所以我还写了一个测试来证明reading case也有效:
@Test
public void shouldReadFromJSON() {
// given
Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).create();
// when
TaskObject actualTaskObject = gson.fromJson("{\"_id\":{\"$oid\":\"51eae100c2e6b6c222ec3431\"}}", TaskObject.class);
// then
TaskObject taskObject = new TaskObject();
taskObject._id = new ObjectId("51eae100c2e6b6c222ec3431");
assertThat(actualTaskObject._id, is(taskObject._id));
}
进一步阅读:
我在从MongoDB数据库检索ObjectID时遇到了一个问题,但在通过json_encode运行时,“_id”值总是消失。数组中的所有其他数据都存在。我的代码如下: 结果如下: 至少,_id应该包含一个对象或数字。我的问题是什么在剥离\MongoDB\BSON\ObjectID,以及如何让它保留下来?
我有一个mongo数据库,它包含这样的时间值 "time": ISODate("2019-11-28T12:51:38.827Z"), 当我使用laravel从数据库中得到这个值时,我得到的结果如下 “时间”:{“$date”:{“$numberLong”:“15749497100”} 我需要将此值转换为可读日期,我在internet解决方案中找到要使用的日期 MongoDB\BSON\UTCDa
问题内容: 我正在尝试将可工作的mongo查询转换为golang中的bson。我掌握了一些基本知识,但仍在努力寻找如何将更高级的查询集成到组合中的方法。 有人可以帮助我转换以下查询吗?希望它应该给我我需要的方向…不幸的是,除了评估和查询之外,我无法找到许多示例。 这在mongo中有效: 这适用于golang / bson: 我该如何正确介绍该声明? 问题答案: 在您的情况下,它将是:
我在MongoDB中使用Java驱动程序3.0,以便通过Web服务发送JSON。 当我想将文档对象(org.bson.文档)转换为JSON时,我使用,当我想将JSON转换为文档对象时,我使用。 但是,当我处理文档列表时(如JSON中所示:
我正在尝试将文件从mongoDB读取到本地。 我的代码如下:STRING=“myLocalPath”PATH=STRING.json 我得到错误-对象类型'ObjectId'是不是JSON序列化...请建议。
本文向大家介绍MongoDB查询以从ObjectId转换为String,包括了MongoDB查询以从ObjectId转换为String的使用技巧和注意事项,需要的朋友参考一下 在MongoDB中使用toString()将ObjectId转换为字符串。让我们创建一个包含文档的集合 在find方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是将ObjectId转换为String的查询- 现