如何使用Json.NET将JSON转换为BSON

19
我有一个包含JSON的字符串。我唯一知道的是这个JSON是有效的。如何将此字符串转换为BSON?
6个回答

27

Newtonsoft.JsonBsonWriter已经过时了。

您需要添加一个名为Json.NET BSON的新nuget包(只需搜索newtonsoft.json.bson),并使用BsonDataWriterBsonDataReader代替BsonWriterBsonReader

public static string ToBson<T>(T value)
{
    using (MemoryStream ms = new MemoryStream())
    using (BsonDataWriter datawriter = new BsonDataWriter(ms))
    {
        JsonSerializer serializer = new JsonSerializer();
        serializer.Serialize(datawriter, value);
        return Convert.ToBase64String(ms.ToArray());
    }

}

public static T FromBson<T>(string base64data)
{
    byte[] data = Convert.FromBase64String(base64data);

    using (MemoryStream ms = new MemoryStream(data))
    using (BsonDataReader reader = new BsonDataReader(ms))
    {
        JsonSerializer serializer = new JsonSerializer();
        return serializer.Deserialize<T>(reader);
    }
}

我正在查看这个链接,当时BSON被添加到Newtonsoft.Json中。[链接](http://james.newtonking.com/archive/2009/12/26/json-net-3-5-release-6-binary-json-bson-support)。_ BSON直接存储二进制数据,避免了常规JSON在处理二进制数据时具有的base64编码文本的时间开销和额外大小。_那么为什么需要进行base64的转换?我并不反对,我也在其他代码示例中看到过这些,我只是感到困惑。 - David Wallace
再次看这个问题,我认为我可以回答自己的问题。正因为BSON直接存储二进制数据,任何以BSON格式编码的包含二进制数据的内容在通过IP传输之前都需要转换为base64,而Json完全基于字符,不需要这样做。然而声称BSON避免了base64的时间开销和额外大小似乎有点不诚实,因为你还是需要在后面进行这种转换。 - David Wallace
2
当然IP可以很好地处理二进制数据,只有HTTP需要Base64编码吗? - Chris F Carroll

11

在我的项目中使用 json 时,我注意到有一种简单而妙的方法将 json 转换为 bson 文档。

 string json = "{\"Name\":\"Movie Premiere\"}";
 BsonDocument document = BsonDocument.Parse(json);

现在您可以在任何地方使用 document 作为 BSON。

注意- 我正在使用这个document 插入到MongoDb 数据库中。

希望这会对您有所帮助。


1
但我认为这种方法并没有使用JSON.net,而是使用来自MongoDB的库。 - shytikov

7

看这里!有一种更简单的方法来做到这一点:

BsonDocument doc = BsonDocument.Parse("{\"your\": \"json\", \"string\": \"here\"}");

如果有人能够想出如何在数组上使用这个解析,那将会很棒。 - Vincent Buscarello
2
你可以使用 BsonArray.Parse @VincentBuscarello - Louie Almeda
那很有帮助。我希望有一些东西可以接受数组或对象,并动态地知道如何处理它。我们最终自己开发了一个,但如果这个库中有这个功能,而且有人知道它,请告诉我。 - Vincent Buscarello

5

3

https://www.nuget.org/packages/Newtonsoft.Json

使用PM命令安装Newtonsoft.Json版本7.0.1:

using Newtonsoft.Json.Bson;
using Newtonsoft.Json;

 class Program
    {
        public class TestClass
        {
            public string Name { get; set; }
        }

        static void Main(string[] args)
        {
            string jsonString = "{\"Name\":\"Movie Premiere\"}";
            var jsonObj = JsonConvert.DeserializeObject(jsonString);

            MemoryStream ms = new MemoryStream();
            using (BsonWriter writer = new BsonWriter(ms))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(writer, jsonObj);
            }

            string data = Convert.ToBase64String(ms.ToArray());

            Console.WriteLine(data);
        }
    }

1
更新:如果您可能想要使用BsonWriter,请注意它已经过时,请查看我的答案。 - Matthias Burger

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接