如何使用Mongo Java客户端将BSON Int64编码为JSON字符串

如何使用Mongo Java客户端将BSON Int64编码为JSON字符串,java,json,mongodb,bson,Java,Json,Mongodb,Bson,当为包含Int64(Java long)值的文档调用org.bson.Document.toJson()时,将使用Mongo的“$numberLong”编码对其进行编码。例如,此代码: Document parse = Document.parse("{}"); parse.put("version", 1L); String json = parse.toJson(); 生成此JSON: { "version" : { "$numberLong" : "1"

当为包含Int64(Java long)值的文档调用
org.bson.Document.toJson()
时,将使用Mongo的“$numberLong”编码对其进行编码。例如,此代码:

    Document parse = Document.parse("{}");
    parse.put("version", 1L);
    String json = parse.toJson();
生成此JSON:

    { "version" : { "$numberLong" : "1" } }
为了使其更具互操作性,我想将其编码为字符串,例如:

    { "version" : "1" }
我已经阅读了和以及大多数Javadoc,但我一辈子都不知道如何为long注册自定义JSON序列化程序。即使是默认的
org.bson.codecs.LongCodec
似乎也没有引入
$numberLong
语法


显然,一个简单的设置(例如,与Gson的
setLongSerializationPolicy(LongSerializationPolicy.STRING)
)等价的设置)将是理想的,但任何实现这一点的方法都将受到欢迎。

对于get strict JSON,您可以使用 和方法序列化()

或者可以使用一些JSON库。比如说

使用json.simple


toJSONString(parse)

我不确定您是否应该为long注册自定义序列化程序,因为
{“version”:“1”}
可以解释为
version
字段是字符串字段。即使是
{“version”:1}
也会有问题,因为它会被解释为整数字段,如果值太大,则可能会出现问题。因此,您需要告诉序列化程序/反序列化程序,
version
是一个long,应该相应地进行转换(可能转换为字符串或从字符串转换而来)。在现实世界中,我从MongoDB加载BSON,将其转换为JSON,发布到消息总线上,另一端的使用者使用Gson将其解析为POJO。Gson阻塞在
{“$numberLong”:“1”}
上。坦白地说,我也很乐意用一种体面的方式为Gson注册一个自定义反序列化程序,以便能够解析它。它已被弃用,是否有新的替代方案?对于Gson选项,我还没有尝试过,但我非常确定
Gson.toJson(parse)
如果
parse
文档,那么它将不会产生任何有用的结果。我目前的解决方案确实使用Gson,但它涉及使用
Document.toJson()
,然后向Gson添加一个自定义反序列化程序,该反序列化程序可以处理
$numberLong
格式,将其解析回一个对象。这是可行的,但丑陋且浪费巨大。
JSON.serialize(parse)
Gson gson = new Gson();
String gsonString = gson.toJson(parse);