Как получить доступ к анонимному атрибуту JSON?

У меня есть следующий JSON:

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

и значение "198" является динамическим и изменяется. Как я могу легко получить доступ к свойству "первой линии", не зная "198" в следующем коде:

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

Ответ 1

Несколько строк сделают это:

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 для работы во всех браузерах вам понадобится Douglas Crockford json2.js из здесь. Чтобы Object.keys работал во всех браузерах, используйте эту прокладку из документация Mozilla JS:

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. Теперь обновляется с помощью возможностей совместимости с кросс-браузером и динамического доступа к данным.

Ответ 2

Если вы не решите конкретно использовать Array на уровне Lines, нет способа гарантировать, какой заказ он выдает.

Используя for..in или Object.keys, вы можете перечислить свойства и просто выйти из цикла на первой итерации. Но опять же, нет гарантии, какой порядок они выйдут, это зависит от реализации. (хотя много раз это будет то, что вы ожидаете)

Ответ 3

Если вы не знаете, каким будет ключ, может оказаться полезным вернуть ваши данные в виде массива:

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

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

Ответ 4

Просто сделайте следующее:

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

Живая демонстрация: http://jsfiddle.net/KBj2G/

(Да, геттер 'properties' должен быть реализован вручную...)