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

标签 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.529Z") }
                                     ^

最佳答案

扩展@user1896296 的回答

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

不是很健壮,不应该用于生产有值(value)的代码。使用正则表达式进行替换。

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

请注意,此功能仅适用于顶级属性。尝试自动转换嵌套属性会变得棘手。

关于javascript - 如何从包含 ISODate 的 BSON 字符串创建 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15762908/

相关文章:

javascript - 修改url中的参数(带变量)

css - 需要所有 SVG 属性值的 JSON 格式表格

php - 使用php将json数据保存到MySQL中

javascript - 如何在 express 中装饰应用程序方法?

php - Symfony2 和提交机智 JavaScript : How to get html content

javascript - 为什么 ng-view 不渲染我的模板?

node.js - 使用express.static 为每个用户提供内容

javascript - 使用node js获取外部网站内容

javascript - 如何使用 Javascript 从字符串中去除 HTML ASCII 代码

javascript - 动态创建加载更多按钮