sql >> データベース >  >> NoSQL >> MongoDB

BSONタイプObjectIdをJSONに変換する(Mongodbに保存)-Java

    これを行うには、少なくとも2つの方法があります。おそらく最も正しい方法は、GSON TypeAdapterを使用して、ObjectIdがJSONに書き込まれる(およびJSONから読み取られる)方法を構成することです。 TypeAdapterを実装するものを作成する必要があります GsonBuilderに登録します 、このようにして、GSONはObjectIdを処理する特別な方法があることを認識します。

    ユースケースとサンプルオブジェクトを使用して、これが機能することを証明する小さなテストを作成しました(ただし、revNoは省略しました) 簡潔にするためのフィールド):

    @Test
    public void shouldWriteCorrectJSON() {
        // given
        TaskObject taskObject = new TaskObject();
        taskObject._id = new ObjectId("51eae100c2e6b6c222ec3431");
    
        Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).create();
    
        // when
        String gsonString = gson.toJson(taskObject);
    
        // then
        assertThat(gsonString, is("{\"_id\":{\"$oid\":\"51eae100c2e6b6c222ec3431\"}}"));
    }
    
    private class ObjectIdTypeAdapter extends TypeAdapter<ObjectId> {
        @Override
        public void write(final JsonWriter out, final ObjectId value) throws IOException {
            out.beginObject()
               .name("$oid")
               .value(value.toString())
               .endObject();
        }
    
        @Override
        public ObjectId read(final JsonReader in) throws IOException {
            in.beginObject();
            assert "$oid".equals(in.nextName());
            String objectId = in.nextString();
            in.endObject();
            return new ObjectId(objectId);
        }
    }
    

    テストでは、JSONが希望どおりに見えることを表明し、ObjectIdTypeAdapterを作成する必要があることに注意してください。 これは、ObjectIdのフィールド名が「$ oid」であり、値がObjectIDの文字列値であり、すべてのフィールドを個別にシリアル化するわけではないことを認識しています。

    オブジェクトのJSONへの書き込み方法を変更する場合は、オブジェクトの読み取り方法も変更する必要があることにも注意してください。そこで、readも実装しました フィールド名が正しいことを確認し(正しくない場合は単純なアサーションを使用するのではなく、ここで例外をスローする必要があります)、値を読み取り、この文字列値からObjectIdを作成します。

    実生活では、どちらの場合もnull値をチェックすることをお勧めします。

    私は責任あるコーダーなので、リーディングケースも機能することを示すテストを作成しました:

    @Test
    public void shouldReadFromJSON() {
        // given
        Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).create();
    
        // when
        TaskObject actualTaskObject = gson.fromJson("{\"_id\":{\"$oid\":\"51eae100c2e6b6c222ec3431\"}}", TaskObject.class);
    
        // then
        TaskObject taskObject = new TaskObject();
        taskObject._id = new ObjectId("51eae100c2e6b6c222ec3431");
        assertThat(actualTaskObject._id, is(taskObject._id));
    }
    

    さらに読む:

    • TypeAdapter
    • GsonBuilder.registerTypeAdapter
    • JsonReaderおよびJsonWriter



    1. 2dジオインデックスを使用してMongooseスキーマの配列でオブジェクトを正しく定義する方法

    2. データベースをmysqlからmongoDbに変換する

    3. 他のluaスクリプトで定義されているlua関数をredisで呼び出すことは可能ですか?

    4. Mongodbの辞書を更新しています