You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Gson与Java转换MongoDB中的"$oid"对象

用Gson解析MongoDB返回的带ObjectId的JSON对象

之前我花了好长时间折腾用Gson转换MongoDB返回的类似User的对象,踩了不少坑,现在把解决方案整理出来,希望能帮到遇到同样问题的朋友!

先看一下MongoDB返回的典型JSON结构(就是我遇到的示例):

{"_id":{ "$oid":"6234a4708c9c871cb7f6de6c"},"email":"foo@energytronik.com","pwd":"something","roles":{"rolename":"reader","comment":true},"created":"2022-03-18T15:25:36.108841Z"}

这里的核心问题是Gson默认无法识别MongoDB这种嵌套的$oid格式,所以要提取里面的ObjectId值,我们需要自定义一个TypeAdapter来处理这个特殊结构。

步骤1:定义对应的实体类

首先创建与JSON结构匹配的Java类,包括对应_id的ObjectId类:

public class User {
    private ObjectId _id;
    private String email;
    private String pwd;
    private Roles roles;
    private String created;

    // 生成Getter和Setter方法
    // 内部类Roles
    public static class Roles {
        private String rolename;
        private boolean comment;

        // 生成Getter和Setter方法
    }
}

// 对应MongoDB的ObjectId结构
class ObjectId {
    private String $oid;

    public String get$oid() {
        return $oid;
    }

    public void set$oid(String $oid) {
        this.$oid = $oid;
    }
}

步骤2:编写ObjectIdTypeAdapter

这个适配器负责处理ObjectId类的序列化和反序列化:

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;

public class ObjectIdTypeAdapter extends TypeAdapter<ObjectId> {

    @Override
    public void write(JsonWriter out, ObjectId value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        // 序列化时写出MongoDB格式的ObjectId
        out.beginObject();
        out.name("$oid").value(value.get$oid());
        out.endObject();
    }

    @Override
    public ObjectId read(JsonReader in) throws IOException {
        ObjectId objectId = new ObjectId();
        in.beginObject();
        while (in.hasNext()) {
            // 只提取$oid字段
            if ("$oid".equals(in.nextName())) {
                objectId.set$oid(in.nextString());
            } else {
                in.skipValue(); // 跳过其他无关字段
            }
        }
        in.endObject();
        return objectId;
    }
}

步骤3:使用Gson注册适配器并解析

最后,我们需要在Gson实例中注册这个适配器,然后就可以正常解析MongoDB返回的JSON了:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class ParseDemo {
    public static void main(String[] args) {
        String mongoJson = "{\"_id\":{ \"$oid\":\"6234a4708c9c871cb7f6de6c\"},\"email\":\"foo@energytronik.com\",\"pwd\":\"something\",\"roles\":{\"rolename\":\"reader\",\"comment\":true},\"created\":\"2022-03-18T15:25:36.108841Z\"}";

        // 注册自定义TypeAdapter
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter())
                .create();

        // 解析成User对象
        User user = gson.fromJson(mongoJson, User.class);

        // 获取ObjectId的值
        String oid = user.get_id().get$oid();
        System.out.println("提取到的ObjectId:" + oid); // 输出:6234a4708c9c871cb7f6de6c
    }
}

这样处理后,Gson就能正确识别MongoDB的ObjectId格式,不管是解析还是序列化都能正常工作啦!

内容的提问来源于stack exchange,提问作者Bruno Poultier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:37:46