如何从包含ISODate的BSONstring中创build一个JSON对象

我想从包含ISODate的string创build一个JSON对象。

var teststring = '{ "_id" : "test001", "CreatedDate" : ISODate("2013-04-02T10:37:21.529Z") }'; console.log(JSON.parse(teststring)); 

获取错误:

 undefined:1 { "_id" : "test001", "CreatedDate" : ISODate("2013-04-02T10:37:21.529Z") } ^ 

要扩大@ user1896296的答案

 var valid = teststring.replace("ISODate(", "").replace(")", ""); 

不是很健壮,不应该用于生产值得的代码。 使用正则expression式来做replace。

 var isoRegex = /ISODate\((".+?")\)/g; teststring = teststring.replace(isoRegex, function (match, parenGroup) { return parenGroup; }); var parsedObj = JSON.parse(teststring); 

即使在这种情况下也能正常工作:

 { "_id" : "test001", "RandomUserInput" : "Sometimes I like to say ISODate(\"2013-04-02T10:37:21.529Z\") in the body of my replies!", "CreatedDate" : ISODate("2013-04-02T10:37:21.529Z") } 

由于用户input中的任何双引号必须转义,所以正则expression式不可能匹配用户提供的input。

而且,如果你真的想把这些字段parsing成date对象,你可以写如下的帮助函数:

 var isoRegex = /"([^"]+?)"\s*:\s*ISODate\((".+?")\)/g; function parseBson (bson) { var dateProps = []; bson = bson.replace(isoRegex, function (match, propName, dateStr) { dateProps.push(propName); return '"' + propName + '" : ' + dateStr; }); var obj = JSON.parse(bson); for (var i in dateProps) obj[dateProps[i]] = new Date(obj[dateProps[i]]); return obj; } var parsedObj = parseBson(teststring); 

请注意,此function只适用于顶级属性。 试图自动转换嵌套的属性会变得棘手。

您的testingstring不是有效的JSONstring,因为

 ISODate("2013-04-02T10:37:21.529Z") 

不是有效的JSONdatetypes(请参见维基百科 )。

因此,在JSON.parse()可以parsing它之前,必须将您的文本string转换为有效的JSON。

对于你的情况,一个简单/天真的文本replace可以解决这个问题:

 //this should work: var valid = teststring.replace("ISODate(", "").replace(")", ""); var parsedObj = JSON.parse(valid); 

请记住, replace()将replace第一次出现(或者在使用正则expression式时出现的所有事件)。

在C#/ .net中,你可以使用Regex.Replace:

  var isoRegex = new Regex("ISODate[(](.+?)[)]"); json = isoRegex.Replace(json, "$1"); 

这会将ISODate("2013-04-02T10:37:21.529Z")更改为"2013-04-02T10:37:21.529Z"