2015-10-07 5 views
-1

Я работаю над этим часами, читая статьи stackoverflow, но я не могу понять это. Я пытаюсь прочитать информацию из файла .json в массив. Файл .json имеет один ключ отображается в огромный массив значений JSON ... Вот код:Как читать файл JSON?

JSON файл:

{ 
"SDpairs": 
[{"SD Pair":"Afghanistan - 
Azerbaijan","Source":"Afghanistan","Dest":"Algeria","Flow":5,"Capacity":16}, 
{"SD Pair":"Afghanistan - 
Azerbaijan","Source":"Afghanistan","Dest":"Australia","Flow":3,"Capacity":3}, 
{"SD Pair":"Afghanistan - Azerbaijan","Source":"Afghanistan","Dest":"Austria","Flow":12,"Capacity":12}, 
{"SD Pair":"Afghanistan - Azerbaijan","Source":"Afghanistan","Dest":"Belgium","Flow":3,"Capacity":10}, 

и т.д ...

метод

JavaScript:

$.getJSON("SDpairs.json", function(data) { 

    var str = JSON.stringify(data); 
    var json = JSON.parse(str); 
    console.log(json); 
    console.log("Type of 'json': " + typeof json); 

    for (var edge in json["SDpairs"]) { 
     console.log(json["SDPairs"][edge]); 
     console.log("Type of 'edge': " + typeof edge); 
     if (currPair == null) { 
      // If it is the first JSON to be read 
      currPair = []; 
      currPair.push(edge); 
     } else if (edge['SD Pair'] == currPair[0]['SD Pair']) { 
      // If the JSON is part of the same SD pair as currPair, push into currPair 
      currPair.push(edge); 
     } else { 
      // If it is a new SDpair as compared to currPair 
      sdPairs.push(currPair); 
      currPair = []; 
      currPair.push(edge); 
     } 
    } 

} 

EDIT:

Ошибки:

Uncaught TypeError: Cannot read property '0' of undefinedinitData @  
database.js:67(anonymous function) @ index.html:31 
database.js:10 Object 
database.js:11 Type of 'json': object 
database.js:14 Uncaught TypeError: Cannot read property '0' of  
undefined(anonymous function) @ database.js:14f.Callbacks.o @  
jquery.min.js:2f.Callbacks.p.fireWith @ jquery.min.js:2w @ 
jquery.min.js:4f.support.ajax.f.ajaxTransport.c.send.d @ jquery.min.js:4 

Update # 1:

var sdPairs = []; 

var initData = function() { 
var currPair = []; 

// Create and push arrays of JSONs into sdPairs. 
// Each array contains edges from the same SD Pair 
$.getJSON("SDpairs.json", function(data) { 

    var num = 0; 
    for (var element in data["SDpairs"]) { 
     var edge = data["SDpairs"][element]; 

     if (currPair.length == 0) { 
      // If it is the first JSON to be read 
      currPair.push(edge); 
     } else if (edge['SD Pair'] == currPair[0]['SD Pair']) { 
      // If the JSON is part of the same SD pair as currPair, push into currPair 
      currPair.push(edge); 
     } else { 
      // If it is a new SDpair as compared to currPair 
      sdPairs.push(currPair); 
      currPair = []; 
      currPair.push(edge); 
     } 

     if (num == 0) { 
      console.log("Edge is " + edge); 
      console.log("edge['SD Pair'] is " + edge['SD Pair']); 
     } 
     num++; 
    } 
    sdPairs.push(currPair); 
}); 
console.log(sdPairs.length); 
console.log(currPair.length); 
} 
+4

Вам не нужно называть 'JSON.stringify' и' JSON.parse'. '$ .getJSON' анализирует JSON для вас. – Barmar

+0

Пожалуйста, добавьте ошибку (+ callstack), которую вы получаете. Также вы можете опубликовать весь файл JSON, чтобы убедиться, что он действителен. – Reinard

+0

Вы сказали, что хотите, и показали нам какой-то код ... но вы не сказали, в чем проблема. Какое поведение вы ожидаете и как это отличается от того, что вы получаете? Как вы это тестируете? – Quentin

ответ

1

Похоже, вы не получаете правильный выход, по двум причинам. Вы сравниваете ключи (а не их значения) в своем цикле for..in. Вы также теряете последний обработанный набор объектов при выходе из цикла. Вы должны добавить его в конце.

var sdPairs=[], currPair; // Remember to declare the variables you're using somewhere 
for(var name in json["SDpairs"]) { 
    var edge = json["SDpairs"][name]; 
    // The rest of your code 
} 
sdPairs.push(currPair); 
console.log(sdPairs); // Do something with sdPairs now 
+0

Спасибо! Это решило эту проблему - есть больше ошибок, которые я получаю, но это действительно очистило мою проблему ссылок JSON. Еще раз спасибо! – Matt

+0

Эй, Плутон, я вернусь к нему для этого проекта, и мне было просто интересно, если вы захотите помочь с еще одной проблемой. Если нет, не беспокойтесь! Я понимаю. В любом случае, я вставил обновленный код в свой первый пост - он находится в разделе «Обновление №1». Оба моих вызова длины массива возвращаются 0. Есть ли у вас какие-либо идеи, почему? Благодаря тонну! – Matt

+0

Да, есть простая причина: '$ .getJSON()' возвращается непосредственно перед тем, как что-либо будет загружено (чтобы он не затормозил весь ваш код и браузер, ожидающие загрузки). В результате все ваши вызовы длины массива выполняются до запуска вашего кода. Вы должны добавить вызов функции или еще один код в конце функции внутри '$ .getJSON', чтобы сделать материал после завершения загрузки. – Pluto

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