如何使用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
相关产品推荐
相关产品推荐

