@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.
В чем проблема, может кто подскажет?
  • Вопрос задан
  • 653 просмотра
Решения вопроса 1
l3ftoverz
@l3ftoverz Куратор тега PHP
Rings of Saturn - The Husk
Она преобразует полностью, просто этот 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, а потом декодируйте
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы