php json парсинг внутри (callback)

450
14 февраля 2017, 21:55

Здравствуйте! Подскажите пожалуйста, как мне спарсить значения json файла, который обернут в callback ?

Получаю значение так:

$json = file_get_contents('https://geoip-db.com/jsonp/00.000.00.00');
$data = json_decode($json);

Само получаемое значение:

callback({"country_code":"RU","country_name":"COUNTRY","city":"CITY","postal":null,"latitude":00.0000,"longitude":00.0000,"IPv4":"00.000.00.00","state":" REGION'"})

Нужны только country_name, city, state

Answer 1

Для одного уровня вложенности можно так.

$json = file_get_contents('https://geoip-db.com/jsonp/00.000.00.00');
preg_match_all("/\{.*\}/",$json,$data2);
$data = json_decode($data2[0][0]);
echo $data->IPv4;
Answer 2

Можно вырезать вызов с помощью регулярного выражения /^\w+\((.*)\)$/
Мы просто пропускаем идентификатор(имя функции) и скобки и захватываем всё, что осталось(искомый json).

Приведённый в вопросе JSON невалиден, 00.00000 - не является валидным числом

Fiddle

<?php
$json = 'callback({"country_code":"RU","country_name":"COUNTRY","city":"CITY","postal":null,"latitude":0.0000,"longitude":0.0000,"IPv4":"00.000.00.00","state":" REGION\'"})';
preg_match('/^\w+\((.*)\)$/', $json, $match);
if (!$match) die('Malformed JSONP');
$data = json_decode($match[1], true);
if (!$data) die ('Malformed JSON');
var_dump($data);

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

Например, так:

'/^\w+\(([\s\S]*)\)$/m'
READ ALSO
Ошибка драйвера mysql при переходе на php7

Ошибка драйвера mysql при переходе на php7

В результате перехода на Bitrix 165 и php версии 7 получил следующую багу:

478
Постраничная навигация в таблице

Постраничная навигация в таблице

Помогите сделать постраничную навигацию по выводу таблиц, к примеру по 20 строк на странице, вот код

407
Как получить все переводы в Laravel?

Как получить все переводы в Laravel?

Нужно получить все все переводы из файлов локализации по выбранному языку в виде многомерного массива

382
Слетели настройки phpStorm

Слетели настройки phpStorm

теперь при подключении пишет такую ошибку:

636