C#에서 MongoDB Bson 문서를 유효한 JSON으로 변환
저는 몽고DBC# 드라이버로 작업하고 있습니다.나는 있습니다BsonDocument
유형: : Object)이 포함된 ID 및 ISO 짜 ).저는 이것을 유효한 범용 JSON 문자열로 변환하고 싶습니다.다시말해서, 나그것가수없다질습니을 같은 것을 가질 수 ._id: ObjectId(...)
또는date: ISODate(...)
하지만 더 선호할 것입니다._id: "..."
그리고.date: "..."
기본적으로 MongoDB만 인식하는 특수 유형을 일반 문자열로 변환하여 보다 쉽게 구문 분석할 수 있도록 하고 싶습니다.와 같은 내장 이 있다는 것입니다..ToJson()
(다른 StackOverflow 답변에서 제안하는 바와 같이) 문서가 이러한 특수 유형을 유지 관리하기 때문에 문서를 유효한 JSON으로 변환하지 않습니다.또한 내 문서에는 많은 수준의 배열과 하위 문서가 포함되어 있으므로 단순한 루프로는 충분하지 않습니다.변환하는 가장 좋은 방법은 무엇입니까?BsonDocument
이 문제를 피할 수 있을까요?모든 문제를 해결하기 위해 문서를 수동으로 반복하는 것보다 내장된 것을 선호합니다.
몽고DB.Bson(2.5+)은 BsonValues와 사이의 매핑을 지원합니다.넷 객체.BsonTypeMapper 클래스
BsonValue(또는 BsonDocument)를 에 매핑합니다.순 객체 사용
var dotNetObj = BsonTypeMapper.MapToDotNetValue(bsonDoc);
그런 다음 선택한 직렬화 라이브러리를 사용할 수 있습니다.예를들면,
JsonConvert.SerializeObject(dotNetObj);
Bson 문서 목록이 있는 경우
var dotNetObjList = bsonDocList.ConvertAll(BsonTypeMapper.MapToDotNetValue);
저도 같은 일을 당했습니다. 다음을 통해 유효한 JSON을 얻을 수 있습니다.
var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
JObject json = JObject.Parse(postBsonDoc.ToJson<MongoDB.Bson.BsonDocument>(jsonWriterSettings));
그러나 다음과 같은 것이 반환됩니다.
{"_id":{"$oid":"559843798f9e1d0fe895c831"}, "DatePosted":{"$date":1436107641138}}
저는 여전히 그것을 납작하게 만드는 방법을 찾고 있습니다.
에 가장 은 제생에가좋방것사다입니용는하법은은장을 사용하는 것입니다.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();
}
}
}
모든 경우(날짜, ID 등)를 올바르게 처리해야 합니다.
JsonConvert.SerializeObject(obj);
대부분의 시간 동안 그것은 효과가 있습니다.필요한 경우 일부 JsonSerializer 설정을 설정할 수 있습니다.
실험을 통해 저는 이 방법이 적절한 JSON을 출력하도록 하는 옵션이 있다는 것을 발견했습니다.
BsonDocument myBsonDocument = ... //code that loads a BSON document
myBsonDocument.ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.RelaxedExtendedJson})
결과:
{ "_id" : { "$oid" : "5fb7a33e73152101d6610e9d" }, "moreProperties" : "moreValues" }
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();
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);
}
제 문제는 DotNet Core WebAPI가 json에 객체를 직렬화하는 방법과 관련이 있습니다.json으로 포맷된 메서드에서 문자열을 반환하면 WEBAPI는 이 문자열을 json으로 다시 직렬화합니다.일반 Bson Document로 작업하여 MongoDb에 저장하는 경우에만 필요합니다.
[HttpGet()]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<string>> GetAsync()
{
return Ok(ret.ToJson());
}
고치다
[HttpGet()]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<object>> GetAsync()
{
var doc = await _collection.Find(...).FirstOrDefaultAsync();
return Ok(JObject.Parse(doc.ToJson()));
}
David Icardi 답변이 더 이상 사용되지 않기 때문에 다음과 같습니다.
- 패키지 설치
- 교체하다
BsonReader
와 함께BsonDataReader
.
확장 방법은 다음과 같아야 합니다.
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using System.IO;
using System.Text;
namespace YourNamespaceGoesHere
{
public static class BsonHelpers
{
public static string ToNormalJson(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 BsonDataReader(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();
}
}
}
}
}
이것은 당신이 찾고 있는 예상 정상 유효한 JSON 문자열을 생성할 것입니다 :)
동적 데이터를 추가할 수 있도록 BsonDocument가 있는 모델을 반환하는 경우 이 ASP.NET Core를 사용해야 하는 경우.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()));
어때
String json = result.toJson(JsonWriterSettings.builder().objectIdConverter(new Converter<ObjectId>() {
@Override
public void convert(ObjectId value, StrictJsonWriter writer) {
writer.writeString(value.toHexString());
}
}).build());
언급URL : https://stackoverflow.com/questions/27132968/convert-mongodb-bsondocument-to-valid-json-in-c-sharp
'it-source' 카테고리의 다른 글
C# csv를 xls로 변환(기존 csv 파일 사용) (0) | 2023.06.25 |
---|---|
기본 웹 브라우저에서 URL 열기 (0) | 2023.06.25 |
Axios put 요청 문제 (0) | 2023.06.25 |
How to remove unused using namespaces (0) | 2023.06.25 |
Find a document with ObjectID in mongoDB (0) | 2023.06.25 |