Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > json_decode не разбирает строку


Автор: solenko 29.2.2008, 13:05
Здравствуйте.
Есть json строка, которая собирается/разбирается javascript'ом на ура. При этом json_decode на ней возвращает null.
Вопрос самый бвнвльный -- почему не работает? Может есть какие-то дополнительные ограничения на json для json_decode? 
Сама строка (прошу простить за объемы, но с более простыми строками и php справляется):
Код

[{"start": "_~ksI}todF@Pq@TWM}@mEiAkRPs@rPmOnHgGN?Xn@H`AlFzUhDhMrDhK~@Ir@sAj@\~IzKpY~XzC~B~AG`J}GpAiANa@`AiAb@WhB[jM@t@F`@P`@_C\qDxBsMlFaZe@{AoB_@mFeCuF_Dm@}@g@]mIoDk@FQz@GG"}]


Автор: skyboy 29.2.2008, 14:43
http://us2.php.net/manual/en/function.json-decode.php#76685 на php.net заявляет следующее:
Цитата

It took me a while to find the right JSON string format grabbed from mysql to be used in json_decode(). Here is what i came up with:

Bad(s) (return NULL):
{30:'13',31:'14',32:'15'}
{[30:'13',31:'14',32:'15']}
{["30":"13","31":"14","32":"15"]}

Good :
[{"30":"13","31":"14","32":"15"}]

returns:
array(1) { [0]=>  array(3) { [30]=>  string(2) "13" [31]=>  string(2) "14" [32]=>  string(2) "15" } }

в связи с этим предлагаю попробовать вариант
Код

[
    {"start": [{
        "lat":55.7574, 
        "lng":37.6003, 
        "id": 4
      }], 
      "end": [{
        "lat":55.7576, 
        "lng":37.5991, 
        "id": 5
      }], 
      "distance":91.22883812411627, 
      "polyline": "wbisIyxndFH@e@pFKE", 
      "levels": "PAAP"
    }], 
    [{"start": [{
        "lat":55.7567, 
        "lng":37.605, 
        "id": 3
    }], 
     "end": [{
        "lat":55.7574, 
        "lng":37.6003, 
        "id": 4
     }], 
     "distance":309.4332263326606, 
     "polyline": "k~hsIevodFiA|Pw@nJIA", 
     "levels": "PAAP"
    }], 
    [{"start": [{
        "lat":55.7558, 
        "lng":37.6084, 
        "id": 2
    }], 
     "end": [{
        "lat":55.7567, 
        "lng":37.605, 
        "id": 3
     }], 
     "distance":237.90049609110721, 
     "polyline": "wxhsIokpdFwAfGs@lEi@pE@@", 
     "levels": "PB@?P"
    }], 
    [{"start": [{
        "lat":55.7548, 
        "lng":37.6118, 
        "id": 1
    }], 
     "end": [{
        "lat":55.7558, 
        "lng":37.6084, 
        "id": 2
     }], 
     "distance":245.3276261210774, 
     "polyline": "orhsIw`qdFFFoE~S", 
     "levels": "PAP"
    }], 
    [{"start": [{
        "lat":55.7576, 
        "lng":37.5991, 
        "id": 5
    }], 
    "end": [{
        "lat":55.772, 
        "lng":37.6048, 
        "id": 23
    }], 
     "distance":1820.5696830145976, 
     "polyline": "_disIkqndFJDSz@ki@oh@gAsAeCsH}@@mBhCa@AsSrEgFtAqE`BAQ", 
     "levels": "PADDBGCDABABP"
    }], 
    [{"start": [{
        "lat":55.772, 
        "lng":37.6048, 
        "id": 23
    }], 
     "end": [{
        "lat":55.7548, 
        "lng":37.6118, 
        "id": 1
     }], 
     "distance":4501, 
     "polyline": "_~ksI}todF@Pq@TWM}@mEiAkRPs@rPmOnHgGN?Xn@H`AlFzUhDhMrDhK~@Ir@sAj@\~IzKpY~XzC~B~AG`J}GpAiANa@`AiAb@WhB[jM@t@F`@P`@_C\qDxBsMlFaZe@{AoB_@mFeCuF_Dm@}@g@]mIoDk@FQz@GG", 
     "levels": "PBBDDBFBAHAACBGCCECDCIBA@AEBB@G@A@HCBCBADDBAP"
    }

]


Добавлено через 6 минут и 3 секунды
поторопился. все равно не работает.

Автор: solenko 29.2.2008, 14:58
skyboy, проблемма не в этом. Только корневой лемент должен быть массивом.
Проверить просто -- берем первые 2 элемента массива из примера -- работает.

Эксперементы показали, что проблемма в одном свойстве (подправил начальный исходник до необходимого минимума).
Что в нем не так понять не могу.

Добавлено через 3 минуты и 28 секунд
половинное деление показало, что проблемма в слеше

Добавлено через 8 минут и 16 секунд
Остался только один вопрос -- как заставить json_decode работать со строками, содержащими слеш(экранирование \\ он не понимает)

Автор: skyboy 29.2.2008, 17:04
Цитата(solenko @  29.2.2008,  13:58 Найти цитируемый пост)
как заставить json_decode работать со строками, содержащими слеш(экранирование \\ он не понимает)

хехе. мало того, что слешировать надо для парсера, но и для PHP тоже. 
то есть, парсинг под PHP обрабатывает "\\\" как "\": сначала один слеш отбрасывает PHP(естественно, если ты при задании исходной строки используешь двойные кавычки или HEREDOC), второй слеш отбрасывает JSON-парсер. 

Автор: coyl 5.6.2008, 12:50
Такая же проблема. При экспериментах выяснилось, что json_decode еще и кирилицу есть не хочет. Только в utf. Может у кого есть на примете хороший класс для разбора Джейсона. А то он и впрям стал потрошителем... для мозгов =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)