Преобразование строки json в собственный объект .net - PullRequest
2 голосов
/ 26 октября 2011

Мне нужно конвертировать JSON в нативный объект .net, используя mongodb.Приложение написано в javascript / mvc.

Одним из полей является объект datetime, и функция toJson в драйвере mongodb форматирует его следующим образом: "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);    

    .... 
}

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Если вы используете официальный драйвер .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")
}
>
1 голос
/ 26 октября 2011

Формат сериализации BSON для DateTime - это Int64, содержащий количество миллисекунд с начала Unix. Таким образом, если бы вам нужно было создать DateTime типа Utc, установленного на 1 января 1970 года, а затем создать TimeSpan с TotalMilliseconds, установленным в Int64, и сложить их вместе, у вас будет дата в Utc. При необходимости можно использовать тот же алгоритм в обратном порядке.

0 голосов
/ 19 июля 2012

Используйте JSON.Net для десериализации вашего Json в JObject и отправьте его в MongoDB ... если у вас есть более конкретные типы в C #, вы захотите сериализовать / десериализовать в / из этого в JSON ..затем сохранитесь от вашего конкретного объекта или JObject.

...