Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从包含ISODate的BSON字符串创建JSON对象_Javascript_Json_Node.js_Bson - Fatal编程技术网

Javascript 如何从包含ISODate的BSON字符串创建JSON对象

Javascript 如何从包含ISODate的BSON字符串创建JSON对象,javascript,json,node.js,bson,Javascript,Json,Node.js,Bson,我试图从一个包含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.529

我试图从一个包含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") }
                                     ^

您的teststring不是有效的JSON字符串,因为

ISODate("2013-04-02T10:37:21.529Z")
不是有效的JSON日期类型(请参阅)

因此,必须先将文本字符串转换为有效的JSON,然后JSON.parse()才能对其进行解析

对于您的情况,简单/简单的文本替换可以解决问题:

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

请记住,
replace()
将替换第一次出现的(或所有出现的,当您使用regexp时)。

以@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);
注意,此函数仅适用于顶级属性。尝试自动转换嵌套属性会变得很棘手。

在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”

这个答案忽略了问题的关键,即如何解析mongo的扩展json格式。一次性正则表达式绝对不是答案。