1

给定一个 JSON 字符串,如下所示:

{
    "__ENTITIES": [
        {
            "__KEY": "196",
            "__STAMP": 1,
            "ID": 196,
            "firstName": "a",
            "middleName": "b",
            "lastName": "c",
            "ContactType": {},
            "addressCollection": {
                "__deferred": {
                    "uri": "/rest/Contact(196)/addressCollection?$expand=addressCollection"
                }
            },
            "__ERROR": [
                {
                    "message": "Cannot save related entity of attribute \"ContactType\" for the entity of datastore class \"Contact\"",
                    "componentSignature": "dbmg",
                    "errCode": 1537
                }
            ]
        }
    ]
}

有没有办法只获取__ERROR记录,我知道我可以使用 var mydata = json.parse(mydata)然后从mydata对象中找到它。但我希望有一种方法可以只返回ERROR类似的字段 json.parse(mydata, "__ERROR")并且只获取__ERROR字段中的信息而不将整个 JSON 字符串转换为对象

4

3 回答 3

4

“有没有一种方法可以只获取__ERROR记录,我知道我可以使用var mydata = json.parse(mydata)......但我希望有......类似的东西json.parse(mydata, "__ERROR")

可能有库可以执行此操作,但没有内置任何内容。您需要编写针对所需数据的代码。

您将获得的最接近的方法是将 reviver 函数传递给JSON.parse.

var errors = [];

var mydata = JSON.parse(mydata, function(key, val) {
    if (key === "__ERROR")
        errors.push(val);
    return val
});
于 2013-01-24T15:18:12.283 回答
1

如果存在这样的函数,它无论如何都必须解析整个事情,才能找到您要查找的密钥。

只需先解析它,然后获取所需的密钥:

var mydata = JSON.parse(mydata);
var errorObj = mydata.__ENTITIES[0].__ERROR[0];

如果需要,您可以创建自己的函数:

function parseAndExtract(json, key) {
    var parsed = JSON.parse(json);
    return parsed[key];
}
于 2013-01-24T15:18:10.113 回答
1

无需将整个 json 字符串转换为对象

这几乎是不可能的,你需要对不适合 JS 的东西进行某种惰性评估。此外,您需要为比 native 慢的合理编写自己的解析器JSON.parse

有没有办法只获取 __ERROR 记录

不是我知道的。此外,遍历整个对象树以查找具有该名称的第一个属性是一项不寻常的任务。更好地__ENTITIES[0].__ERROR[0]显式访问。

于 2013-01-24T15:55:16.247 回答