2017-02-24 7 views
1

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 codecsextended JSONとほとんどのJavadocを読んだことがありますが、私の人生では、長いJSONシリアライザを登録する方法がわかりません。デフォルトのorg.bson.codecs.LongCodecでも、$numberLongの構文を導入するものではないようです。明らかに、単純な設定(例えば、GsonのsetLongSerializationPolicy(LongSerializationPolicy.STRING)と同等)が理想的であるが、この作業を行うための任意の方法は明らかである。

+0

は、私はあなたが '{「1」「バージョン」}ので、一般的にlong型のためのカスタム・シリアライザを登録する必要がわかりません。 '{" version ":1}でも整数フィールドとして解釈されるので問題があり、値が大きすぎると事態が壊れる可能性があります。だからあなたが望むのは、シリアライザ/デシリアライザに、 'version'が長く、それに応じて(おそらくは/から文字列に)変換されるべきであることを伝えることです。 – Thomas

+0

上記の例が考案されています。現実世界では、私はMongoDBからBSONを読み込み、それをJSONに変換し、メッセージバスに公開し、消費者はGsonをPOJOに解析します。そして、Gsonは '{" $ numberLong ":" 1 "}'をチョークします。 私はちょうどGsonがこれを解析できるようにカスタムデシリアライザを登録するためのまともな方法に満足しています。 – Zirzirikos

答えて

0

あなたはcom.mongodb.util.JSON および方法にserialize()

JSON.serialize(parse) 

を使用するかは、いくつかのJSONライブラリを使用することができ、厳密なJSONを取得するために。例えば、GSON。 `文字列フィールドであることVERSION``フィールドとして解釈される可能性:

Gson gson = new Gson(); 
String gsonString = gson.toJson(parse); 
+0

新しい代替手段はありますか? – wutzebaer

+0

Gsonオプションについては、これを試していませんが、 'gson.toJson(parse)'は 'parse'が' Document'の場合には何の役にも立たないでしょう。 私の現在の解決策はGsonを使用していますが、 'Document.toJson()'を使用し、 '$ numberLong'形式を処理してオブジェクトに戻すカスタムデシリアライザをGsonに追加します。これは動作しますが、醜く、非常に無駄です。 – Zirzirikos

関連する問題