2

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

3 回答 3

0

您的测试字符串不是有效的 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()它将替换第一次出现(或所有出现,当您使用正则表达式时)。

于 2013-04-02T12:26:55.860 回答
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);

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

于 2013-04-02T13:56:56.983 回答
0

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

于 2017-10-31T14:31:34.343 回答