@cspdarixuz

Как распарсить json идущий друг за другом со вложенностью?

Дали глупый апи метод - возвращает json-объекты друг за другом без разделителя. Пытаюсь придумать наиболее эффективный метод разобрать это всё.
{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}

Т.е. друг за другом подряд идут
{"key":"value"}
и в таком объекте могут встречаться
"key":{"param2":"value2"}


мне нужно каждый десереализовать в объект естественно.
вложенность может быть любая в теории для такой задачи.
нужно нечто в духе "раз уже один открывающий { встретили, значит, если таковой встретится - его игнорируем и дальше ищем }. Если нашли }, то проверяем, чтобы между первым { и } было равное кол-во { и }."?

Регулярки из гугла все перепробовал, ломаются на вложенности, а свою написать мозгов пока что не хватает, да и зачем, я уверен, кто-то уже делал.
(?<=\{\{).*(?=\}\})
ломается
{([^}]*)}
ломается
итд
Или готов выслушать методы проще и лучше! может не вижу очевидностей
  • Вопрос задан
  • 459 просмотров
Решения вопроса 1
@Giperoglif
$str = '{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}';
$arr = explode('}{', $str);
print_r($arr);

Array
(
[0] => {"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"
[1] => "param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"
[2] => "param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}
)


+немного допилить напильником каждый элемент массива до нормальной json-строки и дальше как обычно

изврат, конечно
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
artzolin
@artzolin
php, WordPress разработка сайтов artzolin.ru
Вы можете воспользоваться json_decode(), чтобы конвертировать в массив, пересобрать и вернуть в json обратно с помощью json_encode()

Пример ваш не работает, потому что вы три массива скопировали в одну строку. Тот, который работает вернет вам один ключ => значение

$json = '{"param1": "value1","param1": "value1","param1": "value1","param1": {},"param1": "value1"}';
$json = json_decode( $json, true );
var_dump($json); // печатает array(1) { ["param1"]=> string(6) "value1" }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы