2016-05-16 2 views
0

Что не так с этой строкой JSON в PHP?json_decode возвращает «JSON_ERROR_SYNTAX», однако JSON кажется ОК

[{"Type":"Chasse|Loisirs","Productions":"Bois d\'Œuvre|Bois de chauffage","Essences principales > Feuillus":"Bouleaux|Hêtres|Merisiers|Peupliers"}] 

Стараюсь онлайн инструменты валидаторы как this one и JSON кажется допустимым, но с PHP я до сих пор есть ошибка:

$result = json_decode($json) 
// JSON_ERROR_SYNTAX 

я пытаюсь удалить UTF-8 BOM, stripslashes, htmlentities ... безуспешно.

Почему этот JSON неисправен, и как это сделать?

+0

Нету его работы. [Онлайн-проверка] (https://3v4l.org/BLFuW) –

+2

'\' 'недействителен JSON. – Biffen

+0

Ваш JSON действителен. Попробуйте jsonlint.com – aldrin27

ответ

4

JSON недействителен, потому что вам НЕ нужно скрывать символ '. Проверьте, например, этот вопрос How to escape special characters in building a JSON string?

JSON RFC 7159 имеет этот раздел

char = unescaped/
     escape (
      %x22/  ; " quotation mark U+0022 
      %x5C/  ; \ reverse solidus U+005C 
      %x2F/  ;/ solidus   U+002F 
      %x62/  ; b backspace  U+0008 
      %x66/  ; f form feed  U+000C 
      %x6E/  ; n line feed  U+000A 
      %x72/  ; r carriage return U+000D 
      %x74/  ; t tab    U+0009 
      %x75 4HEXDIG) ; uXXXX    U+XXXX 

' нет в списке.

Я внес много изменений в вопрос, связанный с экранированием символов Юникода. Формально это не требуется. Проверьте, например, этот вопрос JSON and escaping characters

+0

Наконец-то с редактированием. Надеюсь, теперь ответ правильный. Пожалуйста, дайте мне знать, если вы видите какие-либо проблемы. –

0

Виктор Смирнов уже дал хороший ответ выше, однако я хочу, чтобы объяснить, как можно отладить такую ​​ошибку:

При вводе JSON в http://jsonlint.com/ он будет показывать следующее:

Error: Parse error on line 3: 
...s", "Productions": "Bois d\'Œuvre|Bois 
----------------------^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined' 

Это не сразу показать вам, что это не так точно, но это показывает, что что-то не так со строкой

"Bois d\'Œuvre|Bois de chauffage" 

Заменяя или удаляя символ строки символом, вы можете узнать, что одиночная кавычка не должна быть экранирована.

Так оно и должно быть:

"Bois d'Œuvre|Bois de chauffage" 
Смежные вопросы