Ответ 1
Думаю, вам нужно немного настроить ваш сериализатор JSON. Попробуйте следующее:
var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
Console.WriteLine(document.ToJson(jsonWriterSettings));
Я использую 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?
Думаю, вам нужно немного настроить ваш сериализатор JSON. Попробуйте следующее:
var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
Console.WriteLine(document.ToJson(jsonWriterSettings));
Если данные JSON безопасны для eval (так как это происходит с вашего сервера, вероятно, это так), тогда вы можете сделать так. Это не особенно красиво, но он выполняет свою работу.
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);
как @Louie Almeda предлагает, я думаю, что лучший подход с BsonTypeMapper.MapToDotNetValue. BsonTypeMapperOptions также можно настроить.
Вот что я использую для преобразования списка в BsonDocument в строку json с использованием LINQ и newtonsoft serializer:
var jsonString = JsonConvert.SerializeObject(bsonDocuments.ConvertAll(d => BsonTypeMapper.MapToDotNetValue(d)), Formatting.Indented)
Я понимаю, что я очень опаздываю на эту вечеринку, но я все равно отправлю ответ, если кто-то еще придет искать решение (как и я).
Хитрость заключается в том, чтобы позволить драйверу Mongo db выполнить десериализацию:
var collection = database.GetCollection<Contact>("collection name");
var contact = collection.Find(Query.EQ("Name", "Joe Blow"));
Теперь contact
будет иметь ожидаемые значения.
СЛЕДУЕТ использовать JsonConvert
для правильной конвертации даты в Json. принятый ответ создает объект даты, например: { $date: 190012312211 }
, как упоминал @Rick Strahl. Это должно работать:
object val = BsonTypeMapper.MapToDotNetValue(bsonDocument);
string jsonString = JsonConvert.SerializeObject(val);
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));