Парсинг JSON, невалидный формат ответа

12
Sanu0074
На сайте с 31.08.2012
Offline
110
2749

Здравствуйте. Наткнулся на такой интересный случай, парсю я страничку от гугля (playMarket) с помощью curl, выдает он мне такой ответ в формате json, привел ответ в текстовом файлике json.txt.

Когда я декодирую json на сервере (PHP, json_decode()), скрипт мне выдает JSON_ERROR_SYNTAX, т.е. синтаксическая ошибка. Но, у гугля этот json как-то распаковывается, вот ссылка: тыц, по нажатию на ссылочку Разрешения на странице, шлется POST запрос сюда: https://play.google.com/store/xhr/getdoc, с параметрами: ids=com.getcluster.android&xhr=1.

Как правильно разобрать этот json? ведь у гугла работает......

txt json.txt
дани мапов
На сайте с 06.09.2012
Offline
204
#1

Перед json_decode() ответ прогоняете через какие-нибудь функции?

Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
M
На сайте с 12.11.2005
Offline
122
#2

Sanu0074, на мой беглый взгляд, это не совсем дефолтный json.

Мысль номер раз - ничто не мешает гуглу использовать свой собственный декодер, при этом называя отдаваемый файл *.json по привычке.

Мысль номер два - подгонять получаемый файл под декодер в PHP или писать свой парсер.

Удачи!

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#3

Это не стандартный JSON, это JSON с капелькой Гугла. Поэтому приводить его нужно в стандартный режим.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
Sanu0074
На сайте с 31.08.2012
Offline
110
#4

LEOnidUKG, я тоже об этом подумал, как только это сделать?

---------- Добавлено 14.06.2014 в 15:46 ----------

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

dkameleon
На сайте с 09.12.2005
Offline
386
#5

попробуйте для начала сделать замену:

,, -> ,null,

[, -> [null,

онлайн валидаторам этого хватает

Дизайн интерьера (http://balabukha.com/)
Sanu0074
На сайте с 31.08.2012
Offline
110
#6

dkameleon, не помогло... видать где то еще что то есть.. вобще с какой целью было изменять json на не стандартный формат. + ко всему javascript в браузере как то же обрабатывает этот ответ...

SI
На сайте с 03.12.2007
Offline
130
#7

Для PHP json_decode() нужен строгий вариант JSON, с двойными кавычками:

[null,"aa",{"bb":"cc"}]

А JavaScript скушает и так:

[,'aa',{bb:'cc'}]

-= Онлайн сервисы =-
Sanu0074
На сайте с 31.08.2012
Offline
110
#8

Sigmo#ID, вы видите в приложенном файле с json одинарные кавычки?

siv1987
На сайте с 02.04.2009
Offline
427
#9


while(strpos($str, ',,') !== false){
$str = str_replace(',,', ',"",', $str);
}
$str = str_replace(',]', ',""]', $str);
$str = str_replace('[,', '["",', $str);

$decode = json_decode($str);

JSON строка должна быть в кодировке utf-8

Sanu0074
На сайте с 31.08.2012
Offline
110
#10

siv1987, да, вы правы, работает...

А почему ответ приходит не в utf-8 ?

я же в заголовках посылаю charset:

		$root = "https://play.google.com/store/xhr/getdoc";

$header [] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$header [] = "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3";
$header [] = "Cache-Control: no-cache";
$header [] = "Connection: keep-alive";
$header [] = "Content-Type: application/x-www-form-urlencoded;charset=utf-8";
$header [] = "Host: play.google.com";
$header [] = "Pragma: no-cache";
$user_agent='Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; MRA 8.2 (build 6901); SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)';
$ch = curl_init($root);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_ENCODING , "gzip"); //gzip
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, "ids=".$googleID."&xhr=1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($ch);
curl_close($ch);

Может чтото шлишнее? я смотрел что отправляет клиент и присылает сервер через firebug, постарался всё так же сделать... Может тут чтото лишнее или чегото нехватает?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий