Вы определенно на правильном пути с вашей идеей создания текстового файла. Фактически, это все, что вам нужно сделать: поместите свои данные JSON в текстовый файл и используйте URL-адрес этого текстового файла в своем $.getJSON()
вызовах. Для чистого JSON этот файл нужно будет загружать из того же домена, что и ваша HTML-страница (и на самом деле вы обычно используете относительный URL-адрес в вызове $.getJSON()
.
Итак, первое, что нужно сделать для JSON для вашего данные, которые она еще не:
[
{ "name": "paper", "price": "5" },
{ "name": "bear repellent", "price": "10" }
]
пробельный не имеет значения, вы можете форматировать пробельные так, как вам нравится
вы можете проверить, что у вас есть действительный JSON, вставив его в jsonlint.com..
Итак, если вы поместите эти данные в текстовый файл 'testdata.json'
в тот же каталог, что и ваша HTML-страница, вы можете просто использовать 'testdata.json'
в качестве своего URL-адреса в вызове $.getJSON()
.
Кроме того, этот бит кода не совсем понятен как написанный, или, по крайней мере, имена вводят в заблуждение.
// Go through each received JSON element (assuming array input) and
// log its key value pair to the debug console (using Google Chrome
// as example)
$.each(data, function(key, value) {
console.log("Key is: " + key + " value is: " + value);
});
(Я установил пару простых опечаток в этой копии кода.)
Это $.each()
Переберет весь массив, так что ваши console.log()
вызовов в печати:
Key is: 0 value is: [object Object]
Key is: 1 value is: [object Object]
Теперь одна вещи, которую вы можете сделать, чтобы получить более полезную распечатку, чтобы использовать отдельные аргументы, разделенные запятыми вместо конкатенации строк в console.log()
вызова:
console.log("Key is: ", key, " value is: ", value);
поскольку value
является объектом, console.log()
достаточно умен, чтобы зарегистрировать ее в качестве такого — я Если вы дадите ему шанс сделать это, передав его как отдельный аргумент. Когда он конкатенируется в строку с оператором +
, вы теряете это.
Но более важно то, что код, который вы хотите, вероятно, что-то вроде этого:
// Loop through the elements of the JSON array, and for each one
// log its `name` and `price` properties.
$.each(data, function(i, item) {
console.log(
'Item number:', i,
'| name:', item.name,
'| price:', item.price
);
});
, который должен печатать:
Item number: 0 | name: paper | price: 5
Item number: 1 | name: bear repellent | price: 10
(вертикальные полосы не что-либо существенное, они просто для форматирования вывода немного.)
Я бы также предложил не использовать массив как верхний уровень данных JSON, а сделать его вместо него и поместить в него массив:
{
"items": [
{ "name": "paper", "price": "5" },
{ "name": "bear repellent", "price": "10" }
]
}
Единственное изменение, которое нужно сделать в коде использовать $.each(data.items,...)
вместо $.each(data,...)
.
Основная причина для этого состоит в том, что она более надежна для будущего: что, если позже вы захотите добавить информацию в свой ответ JSON, который не относится к одному элементу в вашем массиве, но применяется к массиву данных/массива в целом? Использование объекта на верхнем уровне делает этот простой:
{
"someglobalthing": "Hello world!",
"items": [
{ "name": "paper", "price": "5" },
{ "name": "bear repellent", "price": "10" }
]
}
и код, который ссылается на json.items
не нужно менять вообще.
Существует также проблема безопасности с массивом JSON верхнего уровня. Я думаю, что это исправлено в современных браузерах, но объект верхнего уровня более универсален в любом случае.
Не может ли Google Chrome сделать это, как вы уже сказали? – Seza
Вы когда-нибудь слышали о [Fiddler] (http://fiddler2.com/)? – epascarello
@ Сеза, хороший вопрос. Я думаю, что он должен быть в состоянии, но в его документации не показано, как это сделать. –