[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с обработкой JSON
LindonAlex
Возникла проблема с обработкой json ответа от сервера.
Допустим на стороне сервера код
class Auto {
public $firm;
public $model;
public $year;
public $price;
public $sellers;

function Auto($firm,$model,$year,$price) {
$this->firm = $firm;
$this->model = $model;
$this->year = $year;
$this->price = $price;
$this->sellers = array();
}
}

$oAuto = new Auto("Audi", "A6", 2008, 78000);
$oAuto->sellers[0] = "1";
$oAuto->sellers[1] = "2";
$oAuto->sellers[2] = "3";
$sJSONText = ($json->encode($oAuto);
echo $sJSONText;

На стороне клиента:
function  serverRequest()
{
if( req.readyState == 4 )
{
if (req.status == 200)
{

var sAuto = JSON.parse(req.responseText);

alert(sAuto.firm);
}
else if (req.status == 404)
{
alert ("Requested URL is not found.");
}
else if (req.status == 403)
{
alert("Access denied.");
}
else
{
alert("status is " + req.status);
}
}
}


Происходит ошибка. Проверяю с помощью alert ответ от сервера - получаю строку
{"firm":"Audi","model":"A6","year":"2008","price":"78000","sellers":["1","2","3"]}
. Если просто эту же строку вместо responseText подставить в обработчик - все замечательно работает. Пробовал вместо
JSON.parse 
просто функцию
eval()
- опять таки - все заработало. Подскажите, где я напортачил?
ЗЫ
Все библиотеки подключены, как со стороны сервера JSON-PHP, так и со стороны клиента JSON.js имеется. Со стороны сервера пробовал встроенные в php 5 функции работы с JSON - результат тот же.



Спустя 6 минут, 8 секунд (19.10.2010 - 16:48) Michael написал(а):
Цитата
JSON.parse

- не во всех браузерах это по моему работает. В современных только.

Спустя 6 минут, 56 секунд (19.10.2010 - 16:55) LindonAlex написал(а):
JSON.parse работает из библиотеки которую беру здесь json.org. Так что по идее не важно на сколько старый браузер - работать должно везде, где поддерживается js. Плюс проблема не в ie6 а в ff 3.6 и десятая опера косячет точно так же.

Спустя 27 минут, 15 секунд (19.10.2010 - 17:23) kirik написал(а):
LindonAlex
А firebug чего говорит?

Спустя 1 час, 1 минута, 44 секунды (19.10.2010 - 18:24) LindonAlex написал(а):
может что то не так делаю с ним (firebug' ом), он останавливается на var sAuto = JSON.parse(req.responseText); и пересылает меня на какую то функцию в JSON.js если не ошибаюсь.

Спустя 9 минут, 27 секунд (19.10.2010 - 18:34) kirik написал(а):
LindonAlex
Всмысле останавливается?
Ошибки какие-нибудь выдает?

Спустя 39 минут, 26 секунд (19.10.2010 - 19:13) LindonAlex написал(а):
вот че мне показал ie8, пишу слово в слово что выдал мне он:
Цитата
исключение брошено и не поймано
json.js
строка: 321
символ: 13

Идем по указанному адресу, тут у нас вот что
// If the text is not JSON parseable, then a SyntaxError is thrown.

throw new SyntaxError('JSON.parse');

Видимо текст который я передаю функции, воспринимается этой функцией как то некорректно.
ЗЫ
firebug юзал раньше только для html и css. А как его для js использовать пока не допер, ушел гуглить...

Спустя 8 минут, 54 секунды (19.10.2010 - 19:22) kirik написал(а):
Цитата (LindonAlex @ 19.10.2010 - 11:13)
А как его для js использовать пока не допер, ушел гуглить...

Если на странице JS ошибки, то на месте значка файрбага появляется красный крестик и количество ошибок (насколько я помню).

Цитата (LindonAlex @ 19.10.2010 - 11:13)
// If the text is not JSON parseable, then a SyntaxError is thrown.

Ага.. не может распарсить принятый JSON.

Попробуйте при отдаче заключитьЗаключите сгенерированную JSON строку в квадратные скобочки. А при приеме доставать 0-й индекс круглые скобки:
var json  = '({"firm":"Audi","model":"A6","year":"2008","price":"78000","sellers":["1","2","3"]})';
var data = eval(json);
alert(data['firm']);

UPD
Можно при передаче, а можно при приеме скобочки доставлять. В аякс классе на 92-й строчке решал подобную проблему таким способом.

Спустя 16 минут, 18 секунд (19.10.2010 - 19:38) LindonAlex написал(а):
Цитата
Попробуйте при отдаче заключитьЗаключите сгенерированную JSON строку в квадратные скобочки. А при приеме доставать 0-й индекс круглые скобки:

Это дело мы проходили - пробовал все скобки подставлять - и квадратные и круглые. Сама функция eval() работает без проблем.
А вот что выдал firebug. По видимому проблема с объектом XMLHttp. Может я для мозиллы не тот создаю? Устарел этот... или вообще не так его обозвал?
Цитата
uncaught exception: [Exception... "Component returned failure code: 0x80540006 [nsIStreamListener.onDataAvailable]" nsresult: "0x80540006 (<unknown>)" location: "JS frame :: chrome://dmbar/content/lib/tracingListener.js :: anonymous :: line 75" data: no]
Create()catego...ategory (строка 35)
category?route=category()catego...ategory (строка 30)
[Break on this error] req = new ActiveXObject("Msxml2.XMLHTTP");
catego...ategory (строка 35)
POST http://localhost/blog/ajax.php
POST http://localhost/blog/ajax.php

200 OK
  44ms

Спустя 5 минут, 19 секунд (19.10.2010 - 19:44) kirik написал(а):
LindonAlex
А ну дык.. ActiveXObject это для ИЕ пойдет, а для ФФ и остальных надо XMLHttpRequest создавать. Посмотрите, я там ссылку на аяксовый класс дал, можете поразбираться.

Спустя 2 минуты, 55 секунд (19.10.2010 - 19:47) vasa_c написал(а):
Цитата
Идем по указанному адресу, тут у нас вот что:
          throw new SyntaxError('JSON.parse');

Посмотрите что выше, по каким причинам бросается это исключение. Займитесь элементарной отладкой.
У меня ваша строка обрабатывается без проблем в FF.

Спустя 5 минут, 31 секунда (19.10.2010 - 19:52) LindonAlex написал(а):
Ложная тревога, XMLHttpRequest создан корректно:
var req = Create();
function Create()
{
try
{
req = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (E)
{
req = false;
}
}

if (!req && typeof XMLHttpRequest!='undefined')
{
req = new XMLHttpRequest();
}
return req;
}

Вот что пишет конкретно по ошибке с JSON.parse:
Цитата
uncaught exception: [Exception... "Component returned failure code: 0x80540006 [nsIStreamListener.onDataAvailable]" nsresult: "0x80540006 (<unknown>)" location: "JS frame :: chrome://dmbar/content/lib/tracingListener.js :: anonymous :: line 75" data: no]

Спустя 7 минут, 7 секунд (19.10.2010 - 19:59) LindonAlex написал(а):
Цитата
Посмотрите что выше, по каким причинам бросается это исключение. Займитесь элементарной отладкой.
У меня ваша строка обрабатывается без проблем в FF.

Сама функция взята, как я уже сказал с json.org. Написана людьми куда более умными чем я, вряд ли у них может быть там где то косяк. А значит делаю я что то не так. И по поводу строки - просто строка в голом виде {"firm":"Audi","model":"A6","year":"2008","price":"78000","sellers":["1","2","3"]} - и у меня через JSON.parse работает. Это я писал еще в первом топике. А вот если я ее беру через responseText - работать не хочет, хотя, как я уже говорил alert эту строку выводит без проблем.

Спустя 54 секунды (19.10.2010 - 20:00) kirik написал(а):
Цитата (LindonAlex @ 19.10.2010 - 11:52)
uncaught exception: [Exception... "Component returned failure code: 0x80540006 [nsIStreamListener.onDataAvailable]" nsresult: "0x80540006 (<unknown>)" location: "JS frame :: chrome://dmbar/content/lib/tracingListener.js :: anonymous :: line 75" data: no]

LindonAlex
А у вас одноклассники без ошибок открываются? smile.gif
Везде пишут что из-за некоторых расширений ФФ такая ошибка вылазит (1, 2, 3)

Спустя 1 минута, 47 секунд (19.10.2010 - 20:02) kirik написал(а):
Цитата (LindonAlex @ 19.10.2010 - 11:59)
А вот если я ее беру через responseText - работать не хочет, хотя, как я уже говорил alert эту строку выводит без проблем.

А в responseText точно эта же строка?

Спустя 3 минуты, 33 секунды (19.10.2010 - 20:06) LindonAlex написал(а):
Цитата
А в responseText точно эта же строка?


Да, точно, я писал уже что
alert(req.responseText);

выводит {"firm":"Audi","model":"A6","year":"2008","price":"78000","sellers":["1","2","3"]}

По поводу одноклассников - все работает. За то скрипт мой не работает нигде, ни в одном браузере.

Спустя 3 минуты, 52 секунды (19.10.2010 - 20:09) kirik написал(а):
LindonAlex
А можете архивчик сделать с необходимыми скриптами?..

Спустя 11 часов, 27 минут, 52 секунды (20.10.2010 - 07:37) Michael написал(а):
В Мозилле напиши еще:
console.log(req.responseText)

вдруг alert чего нибудь не показывает.

ну и да, ссылка на страничку с проблемой может существенно помочь

Спустя 11 часов, 42 минуты, 36 секунд (20.10.2010 - 19:20) LindonAlex написал(а):
Пока не разобрался полностью с проблемой но абсолютно аналогичный скрипт без других функций работает замечательно. Видимо, или проблема с пространством имен или со скриптом на стороне сервера.

Оказалось проблема с насройками .htaccess. Буду думать что делать

Спустя 4 часа, 31 минута, 43 секунды (20.10.2010 - 23:52) LindonAlex написал(а):
В общем корень зла так и не получилось найти, скорее всего это как то связано с политикой безопасности браузера (сам файл обработчик на сервере находится на каталог выше чем файл который работает на стороне клиента, при изменении этой структуры все работает на ура). Но проблему решить получилось с помощью анализатора JSON от google. Вроде все работает замечательно. Советую всем, найти его можно здесь json-sans-eval. Не смотря на название функция eval () в не не используется, так что с безопасностью все в порядке, единственное где то читал что функция парсера не проверяет валидность json строки, так что вернуть может не совсем вменяемые значения, но я пока такого не наблюдал.

Спустя 59 минут, 56 секунд (21.10.2010 - 00:52) arvitaly написал(а):
И чего вам jquery не юзается

Спустя 15 минут, 30 секунд (21.10.2010 - 01:07) kirik написал(а):
Цитата (LindonAlex @ 20.10.2010 - 15:52)
сам файл обработчик на сервере находится на каталог выше чем файл который работает на стороне клиента

Наврядли это.. AJAX не работает кросдоменно, а если домен один, то все должно работать в независимости от местоположения.

Спустя 6 часов, 10 минут, 40 секунд (21.10.2010 - 07:18) Семён написал(а):
Проверяй данные на типы (int)/(string) проблема в этом. wink.gif

Спустя 1 год, 2 часа, 4 минуты, 15 секунд (21.10.2011 - 09:22) Guest написал(а):
Народ. Я, конечно, как всегда вовремя ...
У меня проблема, но не с json.parse, а с parseJson ...
В примере, который я взял с форума, все работает как часы, а когда я фрагмент из примера вставляю в эпизод success команды $.ajax, то все срывается именно на вызове этой команды: per1=$.parseJSON(per).
Не подскажет кто-нибудь где и в чем я мог напахать ???
P.S.
библиотека из примера подключается,
передача по
url: ...,
data: ...,
dataType: 'json',
success: ...,
...
проходит нормально и сервер обрабатывает все по алгоритму, но вот обработать ответ сервера клиент не может.
Функция, работающая на стороне сервера, написана на PHP.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.