当前位置: 首页 > 知识库问答 >
问题:

转换BSON类型ObjectId到JSON(存储在MongoDB)-Java

喻嘉泽
2023-03-14

新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值来查询。

我做错了什么?请帮忙。

谢谢

共有1个答案

陈弘厚
2023-03-14

至少有两种方法可以做到这一点。最正确的方法可能是使用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的查询- 现