Intereting Posts
Должен ли использоваться PDO :: ATTR_PERSISTENT каждый раз? Неустранимая ошибка: исключить исключение SoapFault: Ошибка аутентификации Как отобразить список категорий, содержащих элементы в mysql Создание и передача данных байтов в сокет в PHP на основе кода для C ++ Есть ли способ заставить FPDF / FPDI или Zend_Pdf поддерживать разбор PDF-файлов более чем на 1,4? Laravel: узнайте, является ли переменная Различные версии php, отображаемые в терминале и браузере в ubuntu 11.10 Можно ли надежно использовать Symfony 2.0 с WAMP-сервером? Загрузить / Загрузить файл в базе данных POSTGRESQL с помощью PHP Разверните строку с помощью \ r \ n & \ n & \ r сразу? получение суммарных массивов счетчиков многомерного массива Загрузка модулей динамически в Zend Framework 2 PHP API поддерживает несколько вызовов Расшифровка электронной почты не работает в почтовой почте Нужен ли OpenSSL путь к openssl.conf?

PHP, Недопустимые символы в декодировании JSON

У меня возникли проблемы с запуском 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);