복붙노트

[MONGODB] JSON에 BSON 유형 ObjectId가 변환 (MongoDB의에서 보관) -Java

MONGODB

JSON에 BSON 유형 ObjectId가 변환 (MongoDB의에서 보관) -Java

새로운 GSON (). toJson (새 ObjectId가 ())

나는 위의 작업을 수행 할 때 내가 얻을 출력은

그러나 사실 나는대로되고 싶어

이는 통상적 인 MongoDB의의 ID 형식입니다. 이 자바의 바람직한 방법은 무엇인가?

최신 정보:

내 값 객체

import com.google.gson.annotations.SerializedName;
import org.bson.types.ObjectId;

public class TaskObject {

    @SerializedName("_id")
    private ObjectId _id;

    @SerializedName("revNo")
    private int revNo;
}

나는 정의와 MongoDB를이를 저장하기 위해 노력하고 _id

TaskObject taskObject = new TaskObject();
taskObject.set_id(new ObjectId());
TaskMongoDBClient.getInstance().
        persistNewTaskData(new Gson().toJson(taskObject));

무엇 MongoDB를에 저장되어있는 것은 다음과 같습니다.

대신 _id의 : { "$ OID"XXXX} 나는 OID에 값을 사용하여 조회 할 수 있습니다.

내가 여기에 잘못을하고있는 중이 야? 도와주세요.

감사

해결법

  1. ==============================

    1.이 작업을 수행하는 적어도 두 가지 방법이 있습니다. 아마도 가장 올바른 방법은 ObjectId가이 기록되는 방식을 구성 할 GSON TypeAdapter를 사용 (및 읽기) JSON하는 것입니다. 당신은 GsonBuilder에 등록하고 TypeAdapter 구현은, GSON가 알고있는이 방법은 핸들하며 Object에 특별한 방법 뭔가를 만들어야합니다.

    이 작업을 수행하는 적어도 두 가지 방법이 있습니다. 아마도 가장 올바른 방법은 ObjectId가이 기록되는 방식을 구성 할 GSON TypeAdapter를 사용 (및 읽기) JSON하는 것입니다. 당신은 GsonBuilder에 등록하고 TypeAdapter 구현은, GSON가 알고있는이 방법은 핸들하며 Object에 특별한 방법 뭔가를 만들어야합니다.

    내가 사용 사례와 예제 객체를 사용하여,이 작품을 증명하는 작은 테스트를 작성 (그러나 간결에 대한 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은 당신이 원하는 방식을보고, 나는 ObjectId가의 필드 이름이 "$ OID"이고 값이 단순히 OBJECTID의 문자열 값입니다 이미 알고 ObjectIdTypeAdapter를 만들 수 있다고, 그리고하지 않는 주장하는 것이 개별적으로 모든 필드를에는 직렬화.

    참고 또한 개체가 JSON에 기록되는 방식을 변경하는 경우, 당신은 또한이 읽은 방법을 변경할 필요가있다. 나는 또한 구현했습니다 그래서 필드 이름이 올바른 사람이 (당신은 아마 올바른 아니라면 간단한 어설 사용하는 대신 여기에 예외를 발생한다), 다음 값을 읽고이 문자열 값에서 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));
    }
    

    추가 읽기 :

  2. from https://stackoverflow.com/questions/23061611/converting-bson-type-objectid-to-json-storing-in-mongodb-java by cc-by-sa and MIT license