Обработка MongoDB ISODate() при попытке проанализировать сериализованную строку JSON

Я использую MongoDB через официальный С# драйвер с веб-сайтом ASP.NET MVC.

У меня есть следующая модель С#:

public class Contact
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public DateTime DateAdded { get; set; }
}

Что, если вытащить из MongoDB и сериализовать в строку JSON через MVC, выглядит так:

{
    "_id"  : ObjectId("52eaad4839b60812fca4bf28"),
    "Name": "Joe Blow",
    "DateAdded" : ISODate("2014-01-30T19:51:35.977Z")
}

Когда я пытаюсь преобразовать это из строки JSON в объект Javascript в браузере через JSON.parse(), я получаю следующую ошибку:

Uncaught SyntaxError: Unexpected token I

Это связано с тем, что ISODate(...) недействителен JSON

ObjectId() также недействителен JSON, но способ, которым я занимаюсь, состоит в том, чтобы просто выполнить string.replace() в строке JSON до его разбора на клиенте. Я считал, что делать то же самое для ISODate(), но он чувствует себя немного взломанным.

Есть ли что-то, что я могу сделать, не прибегая к регулярным выражениям на стороне клиента? Возможно, что-то из драйвера MongoDB?

Ответ 1

Думаю, вам нужно немного настроить ваш сериализатор JSON. Попробуйте следующее:

var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
Console.WriteLine(document.ToJson(jsonWriterSettings));

Ответ 2

Если данные JSON безопасны для eval (так как это происходит с вашего сервера, вероятно, это так), тогда вы можете сделать так. Это не особенно красиво, но он выполняет свою работу.

http://jsfiddle.net/CVLhx/

var str = '{"_id"  : ObjectId("52eaad4839b60812fca4bf28"),"Name": "Joe Blow","DateAdded" : ISODate("2014-01-30T19:51:35.977Z")}';

function ObjectId(id) { return id;}
function ISODate(d) {return d;}

var obj = eval('(' + str + ')');
console.log(obj);

Ответ 3

как @Louie Almeda предлагает, я думаю, что лучший подход с BsonTypeMapper.MapToDotNetValue. BsonTypeMapperOptions также можно настроить.

Вот что я использую для преобразования списка в BsonDocument в строку json с использованием LINQ и newtonsoft serializer:

var jsonString = JsonConvert.SerializeObject(bsonDocuments.ConvertAll(d => BsonTypeMapper.MapToDotNetValue(d)), Formatting.Indented)

Ответ 4

Я понимаю, что я очень опаздываю на эту вечеринку, но я все равно отправлю ответ, если кто-то еще придет искать решение (как и я).

Хитрость заключается в том, чтобы позволить драйверу Mongo db выполнить десериализацию:

var collection = database.GetCollection<Contact>("collection name");
var contact = collection.Find(Query.EQ("Name", "Joe Blow"));

Теперь contact будет иметь ожидаемые значения.

Ответ 5

СЛЕДУЕТ использовать JsonConvert для правильной конвертации даты в Json. принятый ответ создает объект даты, например: { $date: 190012312211 }, как упоминал @Rick Strahl. Это должно работать:

object val = BsonTypeMapper.MapToDotNetValue(bsonDocument);
string jsonString = JsonConvert.SerializeObject(val);

Ответ 6

 var IDict = v as IDictionary<string, object>;
                        var dict = IDict.ToDictionary(x => x.Key, x => x.Value);
                        var dateVal = dict["$date"];
                        var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
                        var dateTimeVal = epoch.AddMilliseconds(Convert.ToDouble(dateVal));