我正在尝试从包含ISODate的字符串创建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") }
^
答案 0 :(得分:0)
您的teststring不是有效的JSON字符串,因为
ISODate("2013-04-02T10:37:21.529Z")
不是有效的JSON日期类型(请参阅wikipedia)。
因此,在JSON.parse()解析之前,您必须将texttring转换为有效的JSON。
对于您的情况,简单/天真的文本替换可以解决问题:
//this should work:
var valid = teststring.replace("ISODate(", "").replace(")", "");
var parsedObj = JSON.parse(valid);
请注意,replace()
将替换第一次出现(或使用正则表达式时所有出现次数)。
答案 1 :(得分:0)
通过@ 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);
注意,此功能仅适用于顶级属性。尝试自动转换嵌套属性会变得棘手。
答案 2 :(得分:0)
在C#/ .Net中,您可以使用Regex.Replace:
-match
这会将 var isoRegex = new Regex("ISODate[(](.+?)[)]");
json = isoRegex.Replace(json, "$1");
更改为ISODate("2013-04-02T10:37:21.529Z")
。