2014-01-03 6 views
0

Я хочу загрузить локальный json-файл и прочитать данные с помощью javascript/jquery. Держу пари, это простая ошибка от меня, но я не могу заставить ее работать. Вот код, который я получил до сих пор:доступ к объекту javascript из json

JSON-файл:

{ 
    "sound": { 
    "title": "Bla 1", 
    "file": "bla1" 
    }, 
    "sound": { 
    "title": "Bla 2", 
    "file": "bla2" 
    } 
} 

JavaScript-Сниппает

$.ajax({ 
    type: 'GET', 
    url: 'sounds.json', 
    dataType: 'json', 
    success: {}, 
    data: function(data) {audioFileLibrary = data}, 
    async: false 
}); 
console.log("audioFileLibrary: " + audioFileLibrary); 
console.log("currentAudioFile: " + audioFileLibrary[0]); 

Как выход я получил следующее:

audioFileLibrary: [object Object] 
currentAudioFile: undefined 

Для тестирования пу rposes я попытался следующий код:

for(var i = 0; i < audioFileLibrary.length; ++i){ 
    for(var ind in audioFileLibrary[i]) { 
     console.log(ind); 
     for(var vals in audioFileLibrary[i][ind]){ 
      console.log(vals, audioFileLibrary[i][ind][vals]); 
     }; 
    }; 
}; 

Но нет выхода ... Я надеюсь, что кто-то может показать мне способ решить эту проблему. Спасибо за помощь.

+0

Вы переключили «данные» и «успех». :-) –

+2

Этот вопрос не соответствует теме, потому что это опечатка. –

ответ

0

Сначала исправьте очевидные ошибки в коде, заменив объекты data и success в вашем вызове AJAX. Это заставляет его работать до тех пор, пока вы не столкнетесь с вашей реальной проблемой:

Ваш JSON-файл содержит объект с двумя свойствами с тем же именем. Когда он разбирается, в результате останется только один из них, так как не может быть двух свойств в объекте Javascript с тем же именем.

Вы можете получить доступ к этому свойству, используя имя:

console.log("currentAudioFile: " + audioFileLibrary["sound"]); 

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

[ 
    { 
    "title": "Bla 1", 
    "file": "bla1" 
    }, 
    { 
    "title": "Bla 2", 
    "file": "bla2" 
    } 
] 

Теперь вы можете получить доступ к первому объекту, используя исходный код.

+0

Я изменил файл JSON, но он не изменил результат. Но спасибо за ваш ответ и вашу помощь – fingthily80

0

В этом случае вы, вероятно, захотите использовать getJson.

$.getJSON("sounds.json", function(json) { 
    console.log("JSON Data: " + json.[0].title); 
}); 

Это предполагает, что вы исправить файл JSON в соответствии с рекомендациями:

[ 
    { 
    "title": "Bla 1", 
    "file": "bla1" 
    }, 
    { 
    "title": "Bla 2", 
    "file": "bla2" 
    } 
] 
+0

Спасибо за ваш код, но я не хочу использовать getJSON, потому что мне нужен синхронный вызов, и getJSON является асинхронным. – fingthily80

+0

Полностью пропустил 'async: false'. – jrmyward

0

Во-первых, согласно the docs for $.ajax, data является то, что вы хотите отправить на сервер, а не то, что вернулся. Вместо этого вам нужно переместить значение data в собственность success.

Во-вторых, вы пытаетесь получить доступ к объекту 0 объекта, который, по всей вероятности, не имеет такого свойства. Ваш JSON - объект объектов: превратите его в массив объектов, и ваш поиск [0] должен работать.

Попробуйте это:

$.ajax({ 
    type: 'GET', 
    url: 'sounds.json', 
    dataType: 'json', 
    success: function(data) { 
     audioFileLibrary = data; 
     console.log("audioFileLibrary: " + audioFileLibrary); 
     console.log("currentAudioFile: " + audioFileLibrary[0]); 
    }, 
    async: false 
}); 

С этими данными:

[ 
    { 
    "title": "Bla 1", 
    "file": "bla1" 
    }, 
    { 
    "title": "Bla 2", 
    "file": "bla2" 
    } 
] 
+0

Правильно, вы - не видели этого бита. Благодаря! Я отредактировал, чтобы исправить это =) –

+0

Большое вам спасибо за ваш ответ, но я не получал никакого результата, когда я пытаюсь выполнить код. – fingthily80

0

Ваш JSON объект имеет два объекта с одинаковым ключом/имя все, что вам нужно сделать, это дать уникальный ключ/имя для каждого дочернего объекта.

0

Я нашел решение. Я должен был изменить

audioFileLibrary = data; 

в

audioFileLibrary = $.parseJSON(JSON.stringify(data)) 

И теперь он работает.

Смежные вопросы