如何访问匿名JSON属性?

时间:2011-12-16 17:59:25

标签: javascript json node.js

我有以下JSON:

{
    "Files": {
             "Lines": {
                    "198": {
                           "firstline": "sometext"
                    }
             }
    }
}

,值“198”是动态的并且会发生变化。如何在不知道以下代码中的“198”的情况下轻松访问“firstline”属性:

var schema = JSON.parse(fileContents); 
console.log(schema.Files.Lines.????.firstline);

4 个答案:

答案 0 :(得分:4)

有几行可以做到:

var obj = JSON.parse(your_json);
var lines = obj.Files.Lines;
var keys = Object.keys(lines);
var keyICareAbout = keys[0];
var info  = lines[keyICareAbout];

注意:此解决方案依赖于一些较新的JavaScript功能。要使JSON适用于所有浏览器,您需要来自here的Douglas Crockford json2.js。要使Object.keys能够在所有浏览器中使用,请使用Mozilla's JS docuentation中的此填充程序:

if(!Object.keys) Object.keys = function(o){
 if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
 var ret=[],p;
 for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
 return ret;
}

修改:试试这个jsfiddle。现在更新了跨浏览器兼容性度量并动态访问数据。

答案 1 :(得分:1)

除非您决定在Array级别专门使用Lines,否则无法保证它们会以什么顺序出现。

使用for..inObject.keys,您可以枚举属性,并在第一次迭代时退出循环。但同样,不能保证它们会出现什么样的顺序,这取决于实施。 (虽然很多次,它会是你期望的)

答案 2 :(得分:1)

如果您不知道密钥是什么,将数据作为数组返回可能会有用:

{
    "Files": {
        "Lines": [{
            "id": "198",
            "firstline": "sometext"}]
    }
}

var schema = JSON.parse(fileContents); 
console.log(schema.Files.Lines[0].firstline); //sometext

答案 3 :(得分:1)

这样做:

schema.Files.Lines.properties[0].firstline

现场演示: http://jsfiddle.net/KBj2G/

(是的,'properties' getter必须手动实现......)