Int64(Java long)値を含むドキュメントにorg.bson.Document.toJson()
を呼び出すと、Mongoの "$ numberLong"エンコーディングでエンコードされます。たとえば、このコード:Mongo Javaクライアントを使用してBSON Int64をJSON文字列としてエンコードする方法
Document parse = Document.parse("{}");
parse.put("version", 1L);
String json = parse.toJson();
は、このJSONを生成します:
{ "version" : { "$numberLong" : "1" } }
私はすなわち、このように、代わりに文字列としてエンコードしたいのですが、それはより多くのinteropableにするために:
{ "version" : "1" }
私はwiki on codecsとextended JSONとほとんどのJavadocを読んだことがありますが、私の人生では、長いJSONシリアライザを登録する方法がわかりません。デフォルトのorg.bson.codecs.LongCodec
でも、$numberLong
の構文を導入するものではないようです。明らかに、単純な設定(例えば、GsonのsetLongSerializationPolicy(LongSerializationPolicy.STRING)
と同等)が理想的であるが、この作業を行うための任意の方法は明らかである。
は、私はあなたが '{「1」「バージョン」}ので、一般的にlong型のためのカスタム・シリアライザを登録する必要がわかりません。 '{" version ":1}でも整数フィールドとして解釈されるので問題があり、値が大きすぎると事態が壊れる可能性があります。だからあなたが望むのは、シリアライザ/デシリアライザに、 'version'が長く、それに応じて(おそらくは/から文字列に)変換されるべきであることを伝えることです。 – Thomas
上記の例が考案されています。現実世界では、私はMongoDBからBSONを読み込み、それをJSONに変換し、メッセージバスに公開し、消費者はGsonをPOJOに解析します。そして、Gsonは '{" $ numberLong ":" 1 "}'をチョークします。 私はちょうどGsonがこれを解析できるようにカスタムデシリアライザを登録するためのまともな方法に満足しています。 – Zirzirikos