在尝试解析序列化的JSON字符串时处理MongoDB的ISODate()

Cha*_*evy 14 c# asp.net-mvc json mongodb knockout.js

我通过官方C#驱动程序和ASP.NET MVC网站使用MongoDB.

我有以下C#模型:

public class Contact
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public DateTime DateAdded { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从MongoDB中提取并通过MVC序列化为JSON字符串时,如下所示:

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

当我尝试通过JSON.parse()将其从JSON字符串转换为浏览器上的Javascript对象时,我收到以下错误:

Uncaught SyntaxError: Unexpected token I

这是因为ISODate(...)JSON无效

ObjectId()也是无效的JSON,但我正在处理的方式是string.replace()在客户端解析之前简单地对JSON字符串执行.我考虑做同样的事情,ISODate()但感觉有点太hacky.

如果不在客户端使用正则表达式,我能做些什么吗?也许来自MongoDB驱动程序的东西?

Nei*_*unn 11

我认为你需要更多地调整你的JSON序列化器.试试这个:

var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
Console.WriteLine(document.ToJson(jsonWriterSettings));
Run Code Online (Sandbox Code Playgroud)

  • 它可以生成'有效'的JSON,但它会产生一些非常糟糕的值.日期变为{enter:{$ date:190012312211}},这是一个典型的应用程序将很难做一些有用的事情.自定义JSON.NET转换器可以修复但仍然.如果JsonOutputMode真的很好.严格可以生产'标准'Json. (7认同)

Lou*_*eda 7

您应该使用JsonConvert将日期正确转换为 Json。接受的答案会产生一个日期对象,例如:{ $date: 190012312211 }正如@Rick Strahl 所提到的。这应该有效:

object val = BsonTypeMapper.MapToDotNetValue(bsonDocument);
string jsonString = JsonConvert.SerializeObject(val);
Run Code Online (Sandbox Code Playgroud)