Задать вопрос
@Vitalik_vlk

Парсинг многоэтажного json?

Здравствуйте.

Есть огромный json:, пытаюсь обработать его через json_decode и получаю:

Array ( [0] => Array ( [0] => 86071475 [1] => {"completed_categorized_achievements":{"0":{"0":[1408604553,1408605237],"5":[1408604553],"7":[1408605237],"6":[1408604802],"9":[1408606378],"8":[1408605930]},"1":{"24":[1408605140],"10":[1408605133],"13":[1408607221],"12":[1408605049,1408605049,1408605049],"15":[1408604551,1408605026,1408605569],"14":[1408604553,1408606378],"22":[1408604641,1408605140,1408605682],"16":[1408604519,1408605029],"19":[1408604686,1408605596],"18":[1408604544,1408605617],"1":[1408604721,1408605167],"3":[1408606301],"2":[1408605860],"5":[1408605291],"4":[1408605580,1408607753],"7":[1408605123,1408605167],"6":[1408605159,1408605518,1408605518],"9":[1408604641],"8":[1408605128]},"2":{"12":[1408607112],"7":[1408604721],"6":[1408605010,1408605608,1408606142]}},"division":{"v_div":0,"h_div":0,"need_promoted":false},"static_resources":{"used_talents":0,"army_strength":45,"driving_skill":0,"achievement_points":460},"wish_list":{},"global_collection_wish_item":null,"analytics":{"generation":0,"source":"default"},"talents":{},"expiring_resources":{"collection_receive":null,"global_collection_receive":null},"names":{"squad_name":"\u0411\u0440\u0443\u043a\u043b\u0438\u043d"},"static_maximum_resources":{"srup":{"amount":2,"maximum":2},"srua":{"amount":1,"maximum":1},"srut":{"amount":1,"maximum":1}},"categorized_medal_slots":{"0":{"category":"1","medal":"0","group":"4"},"1":{"category":"0","group":"0","medal":"0"}},"current_territory":"1","medal_slots":{},"chips":{"1":"0","0":"1","2":"0"},"uniform":"0","territories":{"1":{"collected":null,"doll":{"1":"1","2":"0","3":"0","4":"1"}},"0":{"collected":null},"2":{"collected":null}},"version":90,"last_login":1408610248,"phrases":{},"experiences":{"experience":5927},"completed_achievements":{},"decks":{"1":{"parts":{"0":{"cards":{"cards":{"10":{"0":{"grade":"0","flag":null}}}},"current_card":{"index":"0","card":"10"}}}},"0":{"parts":{"1":{"cards":{"cards":{"10":{"0":{"grade":"0","flag":null}}}},"current_card":{"index":"0","card":"10"}},"0":{"cards":{"cards":{"10":{"0":{"grade":"0","flag":null}}}},"current_card":{"index":"0","card":"10"}}}},"2":{"parts":{"0":{"cards":{"cards":{"10":{"0":{"grade":"0","flag":null}}}},"current_card":{"index":"0","card":"10"}}}}}} ) )


Т.е., обрабатывает, но не полностью
Как можно получить доступ к оставшемуся куску json?
  • Вопрос задан
  • 3140 просмотров
Подписаться 2 Оценить 4 комментария
Решения вопроса 1
6 - это
JSON_ERROR_RECURSION One or more recursive references in the value to be encoded

собственнно то, что у вас и есть - json в json
php.net/manual/en/function.json-last-error.php
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@1Michael1
скорее всего проблема в правильности самого json
json_decode пропускает значения, если они были сформированы неправильно (не по описанному стандарту)

Для debug: после json_decode вставить что-то типа:
switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo 'No errors';
        break;
    case JSON_ERROR_DEPTH:
        echo 'Maximum stack depth exceeded';
        break;
    case JSON_ERROR_STATE_MISMATCH:
        echo 'Underflow or the modes mismatch';
        break;
    case JSON_ERROR_CTRL_CHAR:
        echo 'Unexpected control character found';
        break;
    case JSON_ERROR_SYNTAX:
        echo 'Syntax error, malformed JSON';
        break;
    case JSON_ERROR_UTF8:
        echo 'Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
    default:
        echo 'Unknown error';
        break;
}

ну а дальше уже действовать по обстоятельствам :)
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Я все же сильно сомневаюсь в том что у вас стандартный JSON. Он у вас игнорируется, не парсится. Так что можно предположить вто чнутри json еще один json как строка и его надо парсить отдельно. Ибо если бы была ошибка по глубине json_decode выдал бы null и тогда можно было бы отлавливать это через json_get_error (или как-то так). В документации есть пример как хэндлить такие случаи.

Так же попробуйте сторонние парсеры: https://github.com/Seldaek/jsonlint например. Оно должно нормально разобрать если у вас нормальный json.

Если же у вас слоенка с JSON то нужно вручную рекурсивно обходить полученный массив/объект и пробовать делать json_decode. Если поддается, оставляем. НЕ поддается - оставляем старое значение.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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