Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Получение JSON (https://javascript.ru/forum/jquery/17308-poluchenie-json.html)

Tmin10 13.05.2011 22:47

Получение JSON
 
Пытаясь получить данные из JSON:
$("#head").click(function(){
				$.getJSON("json.js", function(json){
  alert("JSON Data: " + json);
});
});

в файле: ["жо",["жорж санд","жорж","жо","жозе моуринью","жорик вартанов","жостово","жозе моуриньо","жожоба","жокей","ж� �вта газета"]]
Но ничего не получается, что не так?

Djeman 14.05.2011 09:14

alert("JSON Data: " + json);

json - это объект. Нужно указывать, какой именно элемент объекта вывести. К примеру, json.element1

Tmin10 14.05.2011 10:18

Прсто для проверки оставил так:
$("#head").click(function(){
					$.getJSON("json.js", function(json){
						alert("JSON Data: ");
					});
				});

При клике ничего не появляется.

Tmin10 15.05.2011 17:06

Что в данном коде не так, писал по мануалу?

Нашёл вот что: когда в качестве callback стоит функция function(data) {} она не отрабатывает, а когда просто alert(""), то всё нормально.

SkyLight 15.05.2011 22:05

Возможно (а даже скорее всего), формат возвращаемых данных неправильный. У формата JSON есть определенные требования.

Tmin10 15.05.2011 22:35

Проверял валидатором, всё отлично, данные выдаёт гуголь- он то не ошибается.

SkyLight 15.05.2011 22:51

А если использовать не getJSON, а, скажем, просто ajax? Тогда результат имеется?

Tmin10 16.05.2011 07:52

Вообще не работает...
Вот код:
$("#head").click(function(){
				$.ajax({
					url: "json.js",
					dataType : "json",				
					success: function (data) { 
					alert("tfdf")//data.geo.lat);					
					}
});

			});

Файл находится в той же папке, в нём:
{"geo":{"lat":"123","lon":"321"}}

walik 16.05.2011 11:26

Воспользуйтесь callback функцией error, может она скажет вам в чем ошибка:
error: function(jqXHR, textStatus, errorThrown) {
     alert(textStatus);
}


И вообще, а почему вы к JS файлу обращаетесь ? вы должны к скрипту который обрабатывается серверным языком (PHP к примеру). В этом и ошибка по моему.

Tmin10 16.05.2011 20:25

Ну это просто файл с текстом, думаю расширение неважно, да и сервер на запрос отдаёт именно text/javascript
error сейчас попробую.


Вроде нашёл причину ошибки и устранил, кажется проблемы с синтаксисом.
Теперь осталось обмануть гуголь и заставить отдать его мне результаты запроса, так как судя по фаербагу гуголь отдаёт пустой файл на запрос. Странно, любому браузеру на http://clients1.google.ru/complete/s...era&q=%E0&cp=1 отдаёт JSON, а скрипту нет...
Кстати, если в JSON объекте находится массив
["а",["анекдоты","авито","аэрофлот","авто ру","афиша","авто","афоризмы","авианова","альфа банк","акинатор"]]

как получить из него
["анекдоты","авито","аэрофлот","авто ру","афиша","авто","афоризмы","авианова","альфа банк","акинатор"]

?

Tmin10 16.05.2011 21:14

Вот ещё: этот код ошибок не вызывает, обращается на сервер, но получает пустой ответ, если смотреть в фаербаге:
$.ajax({
					url: "http://tmin10.net.ru/search.js",//json.js",
					dataType : "json",				
					//error: function(jqXHR, textStatus, errorThrown) {alert(textStatus);},
					success: function (data) { 
					alert("tre");//data.geo.lat);				
					}
				});


error показывает error

walik 16.05.2011 21:48

json.a;

monolithed 16.05.2011 21:52

формат данных неправильный:
["а",["анекдоты","авито","аэрофлот","авто ру","афиша","авто","афоризмы","авианова","альфа банк","акинатор"]]

сами догадаетесь почему?

Tmin10 16.05.2011 22:03

Цитата:

Сообщение от monolithed (Сообщение 105001)
формат данных неправильный:
["а",["анекдоты","авито","аэрофлот","авто ру","афиша","авто","афоризмы","авианова","альфа банк","акинатор"]]

сами догадаетесь почему?

Гуглу веры нет, понимаю, может валидатору стоит поверить?
http://www.jsonlint.com/
Это просто массив без ключей сразу со значениями

Цитата:

Сообщение от walik (Сообщение 105000)
json.a;

а это же не ключ, а просто элемент массива...

monolithed 16.05.2011 22:15

Цитата:

Сообщение от Tmin10
Гуглу веры нет, понимаю, может валидатору стоит поверить?

верить нужно в первую очередь себе.
еще раз повторяю - обратите внимание на на скобки:
*!*{*/!*
'foo', {
     'bar' : [..]
   }
*!*}*/!*

Tmin10 16.05.2011 22:18

Но если гуголь отдаёт именно это?

walik 16.05.2011 22:27

var response = '["а",["анекдоты","авито"]]';
var arr = eval(response);
alert(arr[0]);

Tmin10 16.05.2011 22:31

Цитата:

Сообщение от walik (Сообщение 105010)
var response = '["а",["анекдоты","авито"]]';
var arr = eval(response);
alert(arr[0]);

Отлично, на выходе массив, осталось положит в response информацию с сервера...

Tmin10 16.05.2011 22:56

Эта штука издевается:
$.ajax({
					url: "http://tmin10.net.ru/search.js",
					dataTypeString: "text",
					success: function(data){
						//alert(data)
					alert("OK");
					}
				
				});

И всё равно callback не запускается...
Проверил с помошбю проксика: на сервер уходит запрос, с сервера приходит ответ, а ajax ошибается и ничего не выдаёт...

monolithed 16.05.2011 23:20

ну или более извращенный вариант если все-таки нужен объект JSON:
var obj = {
    *!*
    foo : [{
        'a' : 1,
        'b' : 2
    }]
*/!*
};
 
var json = JSON.parse(JSON.stringify(obj)) ;

alert('a : '+json.foo[0].a+'\nb : '+json.foo[0].b);

Tmin10 16.05.2011 23:43

Подскажите пожалуйста, как всё таки получить простой текст с сервера, уже даже не знаю, где могут быть ошибки...

Kolyaj 17.05.2011 08:23

Цитата:

Сообщение от monolithed
формат данных неправильный:
["а",["анекдоты","авито","аэрофлот" ,"авто ру","афиша","авто","афоризмы"," авианова","альфа банк","акинатор"]]

сами догадаетесь почему?

Я не догадался. Почему?

monolithed 17.05.2011 11:01

Цитата:

Сообщение от Kolyaj
Я не догадался. Почему?

дело было поздней ночью :D, перепутал ответ walik'a с TC
Цитата:

Сообщение от walik
json.a;


Tmin10 17.05.2011 20:47

Ну так что же не правильно в коде получении текста?

monolithed 17.05.2011 20:53

Цитата:

Сообщение от Tmin10
Ну так что же не правильно в коде получении текста?

вам передаются данные в нотации массива, поэтому используйте именно эту нотацию для обработки данных

Tmin10 17.05.2011 20:58

Цитата:

Сообщение от monolithed (Сообщение 105148)
вам передаются данные в нотации массива, поэтому используйте именно эту нотацию для обработки данных

Рад бы, да возникают непонятные препятствия, из-за которых код не работает:

$.ajax({
					url: "http://tmin10.net.ru/search.js",
					dataType : "json",				
					//error: function(jqXHR, textStatus, errorThrown) {alert(textStatus);},
					success: function (data) { 
					alert("tre");//data[1];				
					}
				});

walik 17.05.2011 23:24

Может дело в том что ты пишешь:
dataType : "json"

и поэтому не выполняется функция сукчесс, так как ты не получаешь JSON, и JQuery должен выдать ошибку что то типа: "parseerror"

walik 17.05.2011 23:25

убери dataType

Tmin10 17.05.2011 23:36

Я пытаюсь загрузить именно JSON, но, даже без типа, возникает ошибка.

walik 18.05.2011 09:23

А зачем ты пытаешься загрузить JSON если тебе отдают массив ?

Kolyaj 18.05.2011 09:52

А массив это не JSON?

walik 18.05.2011 09:58

Ну вроде как у JSON такой формат:
{"var1":"val1", "var2":"val2"}

а у массива такой:
['val1', 'val2']

??

И для того что бы получить из строки в формате JSON надо скобочки в eval ставить:
str = eval('({"var1":"val1", "var2":"val2"})');

а для массива не надо:
arr = eval('["val1", "val2"]');


Или я чего то не догоняю в этих форматах ?)))

Kolyaj 18.05.2011 11:56

JSON -- это строка, в которой лежит что-то, удовлетворяющее грамматике http://json.org/
Это и массив, и объект, и строка, и число. Просто чаще всего передают объект, как наиболее расширяемую структуру.

Tmin10 18.05.2011 19:09

Да валидный JSON отдаёт google.
Лучше подскажите где в коде может быть ошибка или приведите рабочий пример, пожалуйста.

Цитата из вики:
Цитата:

JSON строится на двух структурах:
Набор пар имя/значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив.
Пронумерованный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.

Это — универсальные структуры данных. Теоретически, все современные языки программирования поддерживают их в той или иной форме. Так как JSON используется для обмена данными между различными языками программирования, то имеет смысл строить его на этих структурах.

В JSON используются их следующие формы:
Объект — это неупорядоченное множество пар имя/значение, заключённое в фигурные скобки { }. Между именем и значением стоит символ «:», а пары имя/значение разделяются запятыми.
Массив (одномерный) — это множество значений, имеющих порядковые номера (индексы). Массив заключается в квадратные скобки [ ]. Значения отделяются запятыми.
Значение может быть строкой в двойных кавычках, числом, значением true или false, объектом, массивом, или значением null. Эти структуры могут быть вложены друг в друга.
Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки, с использованием escape-последовательностей начинающихся с обратной косой черты (backslash). Символы представляются простой строкой.

monolithed 18.05.2011 21:50

Цитата:

Сообщение от Tmin10
Лучше подскажите где в коде может быть ошибка или приведите рабочий пример, пожалуйста.

$.get('json.html', function(data) {
  $.each(data, function(index, value) {
      alert(index + ': ' + value);
    });
});

Tmin10 24.05.2011 19:53

Я видимо туплю но и Ваш код у меня не работает, можно рабочий пример с HTML обвязкой?


Часовой пояс GMT +3, время: 03:36.