【问题标题】:Converting a json string to a native .net object将 json 字符串转换为原生 .net 对象
【发布时间】:2012-07-19 04:07:24
【问题描述】:

我需要使用 mongodb 将 json 转换为原生 .net 对象。该应用程序是用 javascript/mvc 编写的。

其中一个字段是 datetime 对象,mongodb 驱动程序中的 toJson 函数将其格式化为:"Modified":{"$date":1319630804846}

我想使用相同的格式从客户端解析这个 json,但找不到执行此操作的函数。

在 Newtonsoft.Json 中我使用了这段代码,但由于日期字段而失败:

var jobject = JObject.parse(jsonAsString)
var myObject = jobject.ToObject<myObject>();

但是使用 mongoDb 驱动程序,我所能做的就是将字符串转换为 BsonDocument

var buffer = new JsonBuffer(json);
using (BsonReader reader = new JsonReader(buffer))
{
    var doc = BsonDocument.ReadFrom(reader);    

    .... 
}

【问题讨论】:

  • 已解决:我发现在较新的驱动程序中可以执行 BsonSerializer.Deserialize(json)

标签: mongodb mongodb-.net-driver


【解决方案1】:

DateTime 的 BSON 序列化格式是一个 Int64,包含自 Unix 纪元以来的毫秒数。因此,如果您要创建一个类型为 Utc 的 DateTime 设置为 1970 年 1 月 1 日,然后创建一个 TimeSpan 并将 TotalMilliseconds 设置为 Int64,并将两者相加,您将得到 Utc 中的日期。可以根据需要反向使用相同的算法。

【讨论】:

    【解决方案2】:

    如果您使用的是官方的 .NET 驱动程序,则无需经过 JSON 序列化即可处理对象。

    查看以下示例,了解这有多简单:

    class Child
    {
        public ObjectId id;
        public string name;
        public DateTime birthday;
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Child m = new Child();
            m.name = "Micaiah";
            m.birthday = DateTime.Parse("January 1, 2011");
    
            Children.Insert<Child>(m);
    
            foreach (Child kiddo in Children.FindAllAs<Child>())
            {
                Console.WriteLine("Kiddo: {0} {1}", kiddo.name, kiddo.birthday);
            }
    
            Console.ReadLine();
        }
    
        static MongoCollection Children
        {
            get
            {
                MongoServer s = MongoServer.Create("mongodb://localhost");
                return s["demos"]["children"];
            }
        }
    }
    

    这是存储在 MongoDB 中的记录:

    > db.children.findOne()
    {
        "_id" : ObjectId("4ea821b2dd316c1e70e34d08"),
        "name" : "Micaiah",
        "birthday" : ISODate("2011-01-01T06:00:00Z")
    }
    >
    

    【讨论】:

    • 谢谢,但格式必须是Json,因为应用程序是用C#和javascript编写的mvc应用程序
    【解决方案3】:

    使用 JSON.Net 将您的 Json 反序列化为 JObject,并将其发送到 MongoDB...如果您在 C# 中有更具体的类型,您将希望将其序列化/反序列化到 JSON.. . 然后从您的具体对象或 JObject 中持久化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2019-08-27
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2012-06-14
      相关资源
      最近更新 更多