[MONGODB] C #에서 유효한 JSON에 MongoDB를 BsonDocument 변환
MONGODBC #에서 유효한 JSON에 MongoDB를 BsonDocument 변환
나는 MongoDB를 C #을 드라이버로 일하고 있습니다. 나는 (하며 Object와 ISODates 같은) 일부 MongoDB의 특정 유형을 포함 일부 데이터가있는 BsonDocument 있습니다. 나는 유효한 범용 JSON 문자열이 변환하고자합니다. ObjectId가 (...)이나 날짜 : 즉, 나는 _id 같은 것을 가질 수 없습니다 ISODate을 (...)하지만 _id 선호하는 것 : "..."날짜 : "...". 기본적으로, 나는 그들이보다 쉽게 분석 할 수 있도록 단지 MongoDB를 일반 문자열로 인식이 특별한 형식을 변환 할. 문제는 내장 된 것을 기능 (다른 StackOverflow의 응답이 암시) .ToJson ()처럼 정말이 특별한 형태를 유지하고 있기 때문에 모든에서 유효한 JSON에 문서를 변환하지 않습니다이다. 루프에 대한 간단한 충분하지 않도록 내 문서는, 배열 및 하위 문서의 여러 단계가 포함되어 있습니다. 이 문제를 피하는 BsonDocument을 변환하는 가장 좋은 방법은 무엇입니까? 나는 내장 된 것이 아니라 수동으로 모든 문제를 해결하기 위해 문서를 재귀 이상을 선호하는 것이다.
해결법
-
==============================
1.나는 같은 일에 한 RAN, 당신은 유효한 JSON을 통해 얻을 수 있습니다 :
나는 같은 일에 한 RAN, 당신은 유효한 JSON을 통해 얻을 수 있습니다 :
var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict }; JObject json = JObject.Parse(postBsonDoc.ToJson<MongoDB.Bson.BsonDocument>(jsonWriterSettings));
그러나이 같은를 반환합니다 :
{"_id":{"$oid":"559843798f9e1d0fe895c831"}, "DatePosted":{"$date":1436107641138}}
나는 아직도 그것을 평평하게 할 수있는 방법을 찾기 위해 노력하고있어.
-
==============================
2.어떻게 같은 약 :
어떻게 같은 약 :
JsonConvert.SerializeObject(BsonTypeMapper.MapToDotNetValue(bsonDoc));
BsonDocument의 목록
bsonDocList.ConvertAll(BsonTypeMapper.MapToDotNetValue)
-
==============================
3.이 I 사용을위한 대부분의 시간, Json.NET
이 I 사용을위한 대부분의 시간, Json.NET
JsonConvert.SerializeObject(obj);
트릭을 수행하는 대부분의 시간. 필요가있을 경우 일부 JsonSerializerSettings을 설정할 수 있습니다
-
==============================
4.내 의견으로는 최선의 선택은 Newtonsoft.Json.Bson.BsonReader을 사용하는 것입니다. 완전한 예 여기 :
내 의견으로는 최선의 선택은 Newtonsoft.Json.Bson.BsonReader을 사용하는 것입니다. 완전한 예 여기 :
public string ToJson(BsonDocument bson) { using (var stream = new MemoryStream()) { using (var writer = new BsonBinaryWriter(stream)) { BsonSerializer.Serialize(writer, typeof(BsonDocument), bson); } stream.Seek(0, SeekOrigin.Begin); using (var reader = new Newtonsoft.Json.Bson.BsonReader(stream)) { var sb = new StringBuilder(); var sw = new StringWriter(sb); using (var jWriter = new JsonTextWriter(sw)) { jWriter.DateTimeZoneHandling = DateTimeZoneHandling.Utc; jWriter.WriteToken(reader); } return sb.ToString(); } } }
나는이 올바르게 모든 경우를 처리해야한다고 생각 (날짜, IDS, ...).
-
==============================
5.여기에 내가했던 방법은 MongoDB의 _id 항목을 생략 할 수있다.
여기에 내가했던 방법은 MongoDB의 _id 항목을 생략 할 수있다.
var collection = _database.GetCollection<BsonDocument>("test"); var result = await collection.Find(new BsonDocument()) .Project(Builders<BsonDocument>.Projection.Exclude("_id")) .ToListAsync(); var obj = result.ToJson();
-
==============================
6.당신은 당신이 BsonDocument 동적 데이터를 추가 할 수있는 모델을 반환 할 수있는 경우이 ASP.NET 코어를 사용해야하는 경우. 당신은 MarkKGreenway의 답변에 따라이 JsonConverter 구현을 사용할 수 있습니다!
당신은 당신이 BsonDocument 동적 데이터를 추가 할 수있는 모델을 반환 할 수있는 경우이 ASP.NET 코어를 사용해야하는 경우. 당신은 MarkKGreenway의 답변에 따라이 JsonConverter 구현을 사용할 수 있습니다!
public class BsonDocumentJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(BsonDocument); } public override bool CanRead { get { return false; } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { //string json = (value as BsonDocument).ToJson(); //!NB: this returns BSON not JSON. Why on earth is it called ToJson!? string json = JsonConvert.SerializeObject(value); writer.WriteRawValue(json); } }
그런 다음 Startup.cs 그냥 다음을 추가합니다.
services.AddMvc() .AddJsonOptions(options => options.SerializerSettings.Converters.Add(new BsonDocumentJsonConverter()));
-
==============================
7.이건 어떤가요
이건 어떤가요
String json = result.toJson(JsonWriterSettings.builder().objectIdConverter(new Converter<ObjectId>() { @Override public void convert(ObjectId value, StrictJsonWriter writer) { writer.writeString(value.toHexString()); } }).build());
-
==============================
8.BSON 문서의 내용은 아래로 저장되어있는 경우
BSON 문서의 내용은 아래로 저장되어있는 경우
{ "Date" : "2019-04-05T07:07:31.979Z", "BSONCONTENT" : { "_t" : "MongoDB.Bson.BsonDocument, MongoDB.Bson", "_v" : { "A" : "XXXX", "B" : 234 } }
}
다음은 일반적인 클래스와 함께 작동합니다.
private static T ProcessBsonConversion<T>(BsonDocument data) { var content = data.GetElement("_v"); var jsonDataContent= content.Value.AsBsonValue.ToJson(); return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonDataContent); }
from https://stackoverflow.com/questions/27132968/convert-mongodb-bsondocument-to-valid-json-in-c-sharp by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 합 MongoDB에 의해 기 [중복] (0) | 2019.12.19 |
---|---|
[MONGODB] MongoDB를 findAndModify 노드 JS (0) | 2019.12.19 |
[MONGODB] MongoDB의 정규 표현식 검색 - 자바 스크립트 드라이버 및 NodeJS를 사용하여로 시작 (0) | 2019.12.19 |
[MONGODB] NodeJS와 MongoDB를 사용하여 FindAndModify () 필요 삭제 또는 업데이트 (0) | 2019.12.19 |
[MONGODB] MongoDB를 가져올 수 없습니다 (0) | 2019.12.19 |