@cajka-d

Почему функция json_decode() не до конца преобразует json в массив?

Здравствуйте.
Проблема в том, что функция json_decode() не до конца преобразует json в массив.

Сам json получаю в таком виде с сервиса Бизон.
{"orders":[],"report":{"_id":"5d6233029c8c427ee15ea00e","group":"28508","roomid":"28508:jzmiqr0l2p","webinarId":"28508:jzmiqr0l2p*2019-08-25T09:57:43","report":"{\"rating\":[\"rqNeNoyBH\",\"B50OXoJHr\"],\"urls\":{},\"partners\":{},\"utmStat\":{\"utm_source\":{},\"utm_medium\":{},\"utm_campaign\":{},\"utm_term\":{},\"utm_content\":{},\"utm_keyword\":{},\"utm_banner\":{},\"utm_phrase\":{},\"utm_group\":{}},\"usersMeta\":{\"B50OXoJHr\":{\"_id\":\"5d6231689c8c427ee15e9cf1\",\"playVideo\":1,\"username\":\"Натали\",\"chatUserId\":\"B50OXoJHr\",\"roomid\":\"28508:jzmiqr0l2p\",\"ip\":\"92.38.0.61\",\"mob\":false,\"np\":true,\"webinarId\":\"28508:jzmiqr0l2p*2019-08-25T09:57:43\",\"created\":\"2019-08-25T06:57:44.658Z\",\"view\":1566716264059,\"viewTill\":1566716564255,\"__v\":0,\"messages_num\":3},\"rqNeNoyBH\":{\"_id\":\"5d6231689c8c427ee15e9cf2\",\"playVideo\":1,\"username\":\"Толя\",\"chatUserId\":\"rqNeNoyBH\",\"roomid\":\"28508:jzmiqr0l2p\",\"ip\":\"92.38.0.61\",\"mob\":false,\"np\":true,\"webinarId\":\"28508:jzmiqr0l2p*2019-08-25T09:57:43\",\"created\":\"2019-08-25T06:57:44.663Z\",\"view\":1566716264065,\"viewTill\":1566716565066,\"__v\":0,\"messages_num\":4}}}","messages":"{\"B50OXoJHr\":[\"Привет\",\"Ну да\",\"Кто это?\"],\"rqNeNoyBH\":[\"Хпй\",\"Класс\",\"Я не знаю.\",\"Да и не очень...\"]}","messagesTS":"{\"B50OXoJHr\":[111,180,330],\"rqNeNoyBH\":[144,166,347,360]}","ver":2,"created":"2019-08-25T07:04:34.733Z","__v":0},"room_title":"Вечрний вебенар"}


Преобразую этот json так.
$arr =json_decode($json, true);

В итоге получаю массив, но частично не преобразованный.
Array
(
    [orders] => Array
        (
        )

    [report] => Array
        (
            [_id] => 5d6233029c8c427ee15ea00e
            [group] => 28508
            [roomid] => 28508:jzmiqr0l2p
            [webinarId] => 28508:jzmiqr0l2p*2019-08-25T09:57:43
            [report] => {"rating":["rqNeNoyBH","B50OXoJHr"],"urls":{},"partners":{},"utmStat":{"utm_source":{},"utm_medium":{},"utm_campaign":{},"utm_term":{},"utm_content":{},"utm_keyword":{},"utm_banner":{},"utm_phrase":{},"utm_group":{}},"usersMeta":{"B50OXoJHr":{"_id":"5d6231689c8c427ee15e9cf1","playVideo":1,"username":"Натали","chatUserId":"B50OXoJHr","roomid":"28508:jzmiqr0l2p","ip":"92.38.0.61","mob":false,"np":true,"webinarId":"28508:jzmiqr0l2p*2019-08-25T09:57:43","created":"2019-08-25T06:57:44.658Z","view":1566716264059,"viewTill":1566716564255,"__v":0,"messages_num":3},"rqNeNoyBH":{"_id":"5d6231689c8c427ee15e9cf2","playVideo":1,"username":"Толя","chatUserId":"rqNeNoyBH","roomid":"28508:jzmiqr0l2p","ip":"92.38.0.61","mob":false,"np":true,"webinarId":"28508:jzmiqr0l2p*2019-08-25T09:57:43","created":"2019-08-25T06:57:44.663Z","view":1566716264065,"viewTill":1566716565066,"__v":0,"messages_num":4}}}
            [messages] => {"B50OXoJHr":["Привет","Ну да","Кто это?"],"rqNeNoyBH":["Хпй","Класс","Я не знаю.","Да и не очень..."]}
            [messagesTS] => {"B50OXoJHr":[111,180,330],"rqNeNoyBH":[144,166,347,360]}
            [ver] => 2
            [created] => 2019-08-25T07:04:34.733Z
            [__v] => 0
        )

    [room_title] => Вечрний вебенар
)


Проверяла через json_last_error(), выдает 0.
В чем проблема, может кто подскажет?
  • Вопрос задан
  • 698 просмотров
Решения вопроса 1
l3ftoverz
@l3ftoverz Куратор тега PHP
Люблю Финский металкор
Она преобразует полностью, просто этот JSON экранирован и записан как строка свойства, а не как JSON.
Лучше всего сделать так, что бы тот кто даёт эти данные - отдавал их всё же нормальным JSON.

Если это сторонний сервис, где ну ваще никак это не исправить и нужно как-то жить, я бы так сделал:
<?php
$json = '<json data>';
$jsonArray = json_decode($json, true);

foreach ($jsonArray['report'] as $key => &$value) {
    $value = json_decode($value, true) ?? $value;
}

var_dump($jsonArray);


Сандбокс
Ещё, хорошее решение: нормализовать данные до парсинга JSON, но для этого нужно владеть искусством регулярок, я же им владею слабовато, так что ничего не подскажу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Удалите символы экранирования через str_replace, а потом декодируйте
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
АСТ Москва
от 120 000 руб.
Zelo Москва
от 130 000 руб.
Amigoweb Магнитогорск
от 40 000 до 60 000 руб.