Javascript 参考JSON子数据

Javascript 参考JSON子数据,javascript,jquery,json,Javascript,Jquery,Json,我从数据库返回了下面的JSON。如何在不指定名称的情况下引用元素STOCK?我知道我可以使用NewDataSet.STOCK,但这个JSON是动态的 我尝试了NewDataSet[1],但它不喜欢这样。有办法参考它吗 { "NewDataSet": { "@": { "xmlns": "STOCK" }, "STOCK": { "STOCK_GROUP"

我从数据库返回了下面的JSON。如何在不指定名称的情况下引用元素STOCK?我知道我可以使用NewDataSet.STOCK,但这个JSON是动态的

我尝试了NewDataSet[1],但它不喜欢这样。有办法参考它吗

{
    "NewDataSet": {
            "@": {
                "xmlns": "STOCK"
            },
            "STOCK": {
                "STOCK_GROUP": "Default",
                "STOCK_CODE": "qwertyuiop",
                "FEEDER_OR_TRAY_NUMBER": "1",
                "ENABLED": "Enabled",
                "WEIGHT": "1",
                "PRIORITY": "0",
                "STOCK_TYPE": "Paper",
                "STOCK_ID": "1",
                "VALID_FROM": "1900-01-01T00:00:00+00:00",
                "VALID_TO": "1900-01-01T00:00:00+00:00",
                "STOCK_IMAGE": {}
            }
        }
    }
下面是两行或更多行的示例:

{
    "NewDataSet": {
        "@": {
            "xmlns": "SECURITY_GROUPS"
        },
        "SECURITY_GROUPS": [
            {
                "GROUP_ID": "100",
                "NAME": "Administrators",
                "DESCRIPTION": "Access to all aspects of system"
            },
            {
                "GROUP_ID": "101",
                "NAME": "Operators",
                "DESCRIPTION": "users of device"
            }
        ]
    }
}
然后运行以下javascript:

$.each(data[0], function(key, value) {
    columnArr.push({"sTitle" : key});
});

$.each(data, function(key, value) {
    var innerArr = [];
    $.each(value, function(innerKey, innerValue) {
        innerArr.push(innerValue);
    });
    alueArr.push(innerArr);
});

它会有多大的动力?一个属性是否始终为“@”,然后始终存在一个(且只有一个)您想要的其他属性?如果是这样,jQuery
$。每个方法都可以工作:

$.each(NewDataSet,function(index,value){
    if(index !== '@'){
        //do your stuff
    }
});

不能使用数组索引引用对象的属性。
@
属性是否始终包含名称?如果是这样,您可以使用:

var prop = NewDataSet["@"]["xmlns"];
NewDataSet[prop]["WEIGHT"] // equal to "1"

您可以像这样迭代关联数组中的元素:

for (var key in NewDataSet) {
    if (obj.hasOwnProperty(key)) {
        // key holds 'STOCK', obj[key] holds the data you are after
    }
}
查看数据,他们建议您实际应该做的是显式检索“@”,然后在其中检查“xmlns”,以了解您应该搜索的键

---编辑后再进行编辑,这是您需要的,这一点更清楚

var tableName = NewDataSet['@'].xmlns;
var rows = NewDataSet[tableName];
// enforce array
if (!rows.hasOwnProperty('length')) { rows = [rows]; }

在解析对象属性之后,您只能对其进行迭代。始终会有@,但可能会有许多库存行。我希望使用$。在获取我的数据后,使用var data=NewDataSet[“库存”];$进行迭代。每个(数据[0],函数(索引,值){});fails@将始终包含名称,但如果有大量库存记录,NewDataSet[prop]是否会返回所有行,以便我可以循环它们?如果从数据库返回1…n行,则“库存”应为数组。您可以使用
NewDataSet[prop][0]
访问一行,请参见更新的问题。您的方法适用于安全组,但不适用于库存。我看到它得到了数据,但是我的循环失败了var data=NewDataSet[“STOCK”];数据[0]未定义,但如果使用安全组,则可以使用,因为
NewDataSet[“STOCK”]不是数组,而是对象。如果只有一行,服务器将生成不同的代码。您应该始终返回一个数组,即使它只有一个元素,这样您就可以避免任何“特殊情况”。哇!这真是太神奇了,我想这可能是一个stringify bug,所以我们走了这条路。我不想尝试强制执行数组,因为我不知道如何检查是否为数组。您也可以根据使用数组的
行实例。名称与
length
冲突的可能性很低,因为字段都是大写的,所以您的方式可能会起作用。我刚刚发现,如果表没有数据,就没有@property。有没有办法让我知道它是否存在?