[MONGODB] JSON에 BSON 유형 ObjectId가 변환 (MongoDB의에서 보관) -Java
MONGODBJSON에 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.이 작업을 수행하는 적어도 두 가지 방법이 있습니다. 아마도 가장 올바른 방법은 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)); }
추가 읽기 :
from https://stackoverflow.com/questions/23061611/converting-bson-type-objectid-to-json-storing-in-mongodb-java by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽구스 집계 쿼리 / Mockgoose 시험은 다른 곳에서 작동 농담 실패 (0) | 2019.12.27 |
---|---|
[MONGODB] NG는-경우가해야보다 더 많은 시간을 호출되는 (0) | 2019.12.27 |
[MONGODB] 어떻게 MongoDB를 함께 배열의 순서를 변경하려면? (0) | 2019.12.26 |
[MONGODB] MongoDB를의 통합 프레임 워크 이동 평균? (0) | 2019.12.26 |
[MONGODB] MongoDB를 집계하여 문자열의 배열을 반환하는 방법 (0) | 2019.12.26 |