У меня возникли проблемы с запуском json_decode для работы с определенной строкой, которую я получаю.
Я сузил его до этой строки:
"systemNotes [6]": "09 января 2013 г. 12:52 – Название теста – Измененный адрес фактуры 2 От до Отправка Имя: Отправка Фамилия: Адрес электронной почты: Адрес доставки: Адрес доставки 2: Доставка Город: Доставка Почтовый индекс / Почтовый индекс: Доставка Страна: Состояние доставки: Телефон: Оплата Имя: Фамилия: Биллинг адрес: Биллинг адрес 2: Оплата C "
Копируя json из этого вопроса, проблема не воспроизводима, но здесь присутствует репрезентативный фрагмент оригинального json: http://codepad.org/ZzrC7rqQ – и помещая это в jsonlint.com :
Parse error on line 3: ... "systemNotes[6]": "January 09, 2013 12 -----------------------^ Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
Что не так с этой строкой, что это неверно json?
РЕДАКТИРОВАТЬ
Мне удалось найти точный код.
"SystemNotes [6]": "Январь + 09% 2C + 2013 + 12% 3A52 + PM ++ Первый + Имя ++ Изменено ++ Billing + Адрес + 2 + С ++ до + доставка + Первый + Наименование% 3A% 09 + доставка + Последнее + Наименование% 3A% 09 + Email + Адрес% 3A% 09 + доставка + Адрес% 3A +% 09 + доставка + Адрес + 2% 3A +% 09 + доставка + Город% 3A +% 09 + доставка + Zip% 2FPostal% 3A +% 09 + доставка + Страна% 3A +% 09 + доставка + государство% 3A +% 09 + Телефон% 3A +% 09 + Billing + Первый + Имя% 3A +% 09 + Billing + Последнее + Наименование% 3A +% 09 + Billing + Адрес% 3A +% 09 + биллинг + Адрес + 2% 3A +% 09 + биллинг + С»
Кажется, это нормально, поэтому, возможно, проблема возникает, когда я делаю parse_str, вот код, который я использую:
$response = apiConnection($data); parse_str($response, $parse); $each = json_decode($parse['data']); foreach($each as $key => $order){ //do something }
Проблема в том, что символы табуляции недопустимы внутри строки.
Удалив символы табуляции, такие как здесь http://codepad.org/8fnQphkS, и используя это на jsonlint.com, вы увидите, что теперь видите действительный json.
Взгляните на спецификации для JSON по адресу http://www.ietf.org/rfc/rfc4627.txt?number=4627 специально в разделе 2.5, где символ табуляции вызывается по имени как один из символов, который должен быть экранирован, если внутри строки.
РЕДАКТИРОВАТЬ:
Вот способ удаления всех вкладок и нескольких пробелов и их замены одним символом пробела:
$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data));
вы что-то пробовали? это поможет очистить строку
$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring);
попробуйте передать true
как второй параметр json_decode. Согласно Документации , он возвращает ассоциативный массив вместо объекта со вторым аргументом как истинный.
$each = json_decode($parse['data'], true);