扩展@ user1896296的答案
var valid = teststring.replace("ISODate(", "").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")
}
由于用户输入中的任何双引号都必须转义,因此正则表达式不可能匹配用户提供的输入。
此外,如果您真的想将这些字段解析为日期对象,您可以编写一个辅助函数,如下所示:
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);
请注意,此功能仅适用于顶级属性。尝试自动转换嵌套属性会很棘手。