복붙노트

[MONGODB] C #에서 유효한 JSON에 MongoDB를 BsonDocument 변환

MONGODB

C #에서 유효한 JSON에 MongoDB를 BsonDocument 변환

나는 MongoDB를 C #을 드라이버로 일하고 있습니다. 나는 (하며 Object와 ISODates 같은) 일부 MongoDB의 특정 유형을 포함 일부 데이터가있는 BsonDocument 있습니다. 나는 유효한 범용 JSON 문자열이 변환하고자합니다. ObjectId가 (...)이나 날짜 : 즉, 나는 _id 같은 것을 가질 수 없습니다 ISODate을 (...)하지만 _id 선호하는 것 : "..."날짜 : "...". 기본적으로, 나는 그들이보다 쉽게 ​​분석 할 수 있도록 단지 MongoDB를 일반 문자열로 인식이 특별한 형식을 변환 할. 문제는 내장 된 것을 기능 (다른 StackOverflow의 응답이 암시) .ToJson ()처럼 정말이 특별한 형태를 유지하고 있기 때문에 모든에서 유효한 JSON에 문서를 변환하지 않습니다이다. 루프에 대한 간단한 충분하지 않도록 내 문서는, 배열 및 하위 문서의 여러 단계가 포함되어 있습니다. 이 문제를 피하는 BsonDocument을 변환하는 가장 좋은 방법은 무엇입니까? 나는 내장 된 것이 아니라 수동으로 모든 문제를 해결하기 위해 문서를 재귀 이상을 선호하는 것이다.

해결법

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

    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. ==============================

    2.어떻게 같은 약 :

    어떻게 같은 약 :

    JsonConvert.SerializeObject(BsonTypeMapper.MapToDotNetValue(bsonDoc));
    

    BsonDocument의 목록

    bsonDocList.ConvertAll(BsonTypeMapper.MapToDotNetValue)
    
  3. ==============================

    3.이 I 사용을위한 대부분의 시간, Json.NET

    이 I 사용을위한 대부분의 시간, Json.NET

    JsonConvert.SerializeObject(obj); 
    

    트릭을 수행하는 대부분의 시간. 필요가있을 경우 일부 JsonSerializerSettings을 설정할 수 있습니다

  4. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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);
    
        }
    
  9. from https://stackoverflow.com/questions/27132968/convert-mongodb-bsondocument-to-valid-json-in-c-sharp by cc-by-sa and MIT license