簡體   English   中英

在嘗試解析序列化的JSON字符串時處理MongoDB的ISODate()

[英]Handling MongoDB's ISODate() when attempting to parse a serialized JSON string

我通過官方C#驅動程序和ASP.NET MVC網站使用MongoDB。

我有以下C#模型:

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

從MongoDB中提取並通過MVC序列化為JSON字符串時,如下所示:

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

當我嘗試通過JSON.parse()將其從JSON字符串轉換為瀏覽器上的Javascript對象時,我收到以下錯誤:

Uncaught SyntaxError: Unexpected token I

這是因為ISODate(...)不是有效的JSON

ObjectId()也不是有效的JSON,但我正在處理的方法是在JSON字符串上執行string.replace()之前在客戶端上解析它。 我考慮過為ISODate()做同樣的ISODate()但感覺有點過於hacky。

如果不在客戶端使用正則表達式,我能做些什么嗎? 也許來自MongoDB驅動程序的東西?

我認為你需要更多地調整你的JSON序列化器。 嘗試這個:

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

您應該使用JsonConvert將Date正確轉換為Json。 接受的答案會產生一個日期對象,如: { $date: 190012312211 }正如@Rick Strahl所提到的那樣。 這應該工作:

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

正如@Louie Almeda建議的那樣,我認為最好的方法是使用BsonTypeMapper.MapToDotNetValue。 BsonTypeMapperOptions也可以自定義。

這是我使用LINQ和newtonsoft序列化器將BsonDocument上的列表轉換為json字符串的方法:

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

如果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);

我意識到我參加這個派對的時間已經很晚了,但無論如何我會發一個答案,以防其他人出現尋找解決方案(正如我所做的那樣)。

訣竅是讓Mongo數據庫驅動程序進行反序列化:

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

現在contact將具有預期值。

 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM