将MongoDB BsonDocument转换为C#中的有效JSON

Cyn*_*mer 12 json mongodb mongodb-.net-driver

我正在使用MongoDB C#驱动程序.我有BsonDocument一些数据,其中包括一些特定于MongoDB的类型(如ObjectID和ISODates).我想将其转换为有效的通用JSON字符串.换句话说,我不可能有这样的事情_id: ObjectId(...)还是date: ISODate(...)而是宁愿_id: "..."date: "...".基本上,我想将只有MongoDB识别的特殊类型转换为常规字符串,以便更容易地解析它们.问题是内置函数.ToJson()(其他StackOverflow答案建议)并没有真正将文档转换为有效的JSON,因为它维护了这些特殊类型.我的文档还包含许多级别的数组和子文档,因此简单的for循环是不够的.转换BsonDocument它的最佳方法是什么来避免这个问题?我更喜欢内置的东西而不是手动递归文档来修复所有问题.

dry*_*rye 17

我遇到了同样的事情,你可以通过以下方式获得有效的JSON:

var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
JObject json = JObject.Parse(postBsonDoc.ToJson<MongoDB.Bson.BsonDocument>(jsonWriterSettings));
Run Code Online (Sandbox Code Playgroud)

但它会返回如下内容:

{"_id":{"$oid":"559843798f9e1d0fe895c831"}, "DatePosted":{"$date":1436107641138}}
Run Code Online (Sandbox Code Playgroud)

我还在试图找到一种方法来压扁它.

  • ```JsonOutputMode.Strict``` 现在已*过时*,替换为 ```JsonOutputMode.RelaxedExtendedJson``` 对我有用。 (2认同)

Dav*_*rdi 10

在我看来,最好的选择是使用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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这应该正确处理所有情况(日期,ID,...)。


Jor*_*rdi 8

通过实验,我发现有一个选项可以使该方法输出正确的 JSON:

BsonDocument myBsonDocument = ... //code that loads a BSON document
myBsonDocument.ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.RelaxedExtendedJson})
Run Code Online (Sandbox Code Playgroud)

结果:

{ "_id" : { "$oid" : "5fb7a33e73152101d6610e9d" }, "moreProperties" : "moreValues" }
Run Code Online (Sandbox Code Playgroud)

  • MongoDB 程序员没有将其设置为默认输出,真是可耻! (2认同)

san*_*jat 7

如何是这样的:

JsonConvert.SerializeObject(BsonTypeMapper.MapToDotNetValue(bsonDoc));
Run Code Online (Sandbox Code Playgroud)

有关BsonDocument的列表

bsonDocList.ConvertAll(BsonTypeMapper.MapToDotNetValue)
Run Code Online (Sandbox Code Playgroud)

  • 这就是答案。我已经多次尝试解决此问题,具体表现为几种不同的方式,从 id 到日期时间类型,然后转换为 Dot Net,从而按照您期望的方式转换为 JSON。出色的工作,谢谢。 (3认同)
  • 这个答案完全说到点上了。这里的问题是将 BSON 文档转换为映射到 DotNet 的对象。 (2认同)

Mar*_*way 5

我使用的大多数时间都是Json.NET

JsonConvert.SerializeObject(obj); 
Run Code Online (Sandbox Code Playgroud)

大多数情况下都能达到目的。如果需要,您可以设置一些JsonSerializerSettings