【问题标题】:How to create a JSON object from a BSON string which contains ISODate如何从包含 ISODate 的 BSON 字符串创建 JSON 对象
【发布时间】:2017-10-31 22:31:34
【问题描述】:

我正在尝试从包含 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") }
                                     ^

【问题讨论】:

    标签: javascript json node.js bson


    【解决方案1】:

    扩展@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);
    

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

    【讨论】:

    • 这个答案漏掉了问题的重点,即如何解析mongo的扩展json格式。一次性正则表达式绝对不是答案。
    【解决方案2】:

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

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

    不是有效的 JSON 日期类型(请参阅 wikipedia)。

    因此,您必须在 JSON.parse() 解析之前将您的文本字符串转换为有效的 JSON。

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

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

    请记住,replace() 将替换第一次出现(或所有出现,当您使用正则表达式时)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 1970-01-01
        • 2013-10-29
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        相关资源
        最近更新 更多