json_decode возвращает JSON_ERROR_SYNTAX в OpenCart

Я работаю над интерфейсом администратора расширения доставки OpenCart.

У меня есть форма со скрытым полем, это поле заполняется JSON.stringify(rules) во внешнем интерфейсе.

Переменная rules представляет собой многоуровневый объект.

В контроллере я могу прочитать переменную $this->request->post['rules'] и выглядит как действительный JSON, но json_last_error() дает мне JSON_ERROR_SYNTAX

Я проверяю, что мой JSON является UTF-8 с mb_detect_encoding() (возвращает ASCII), и я удалил недопустимые символы со следующим кодом

for ($i = 0; $i <= 31; ++$i) { 
    $rules = str_replace(chr($i), "", $rules); 
}
$rules = str_replace(chr(127), "", $rules);

if (0 === strpos(bin2hex($rules), 'efbbbf')) {
    $rules = substr($rules, 3);
 }

пример моего сгенерированного JSON"

{"SMEVT":{"id":"SMEVT","name":"Free","high":99999,"low":575,"amount":0,"type":1},"VZWSR":{"id":"VZWSR","name":"25%","high":575,"low":0,"amount":25,"type":1}}

Я не могу понять, что json_decode не будет работать. Спасибо за любую помощь.

ОБНОВИТЬ:

Я использовал strlen($rules) и обнаружил, что строка намного длиннее, чем ожидалось, кажется, OpenCart (или что-то еще) добавляет &quot; вместо " в строку JSON.

Кто-нибудь знает простой способ очистить это?


person mbryant    schedule 10.06.2014    source источник
comment
сделать var_dump($this->request->post['rules']). Вы не должны коверкать строку json с помощью str_replace и тому подобного. эти функции не безопасны для юникода.   -  person Marc B    schedule 10.06.2014
comment
вы пометили это с помощью javascript и json, но похоже, что вы используете PHP. Если вы пытаетесь использовать JS для анализа JSON, вам нужно использовать JSON.parse(str).   -  person zzzzBov    schedule 10.06.2014
comment
JSON lint возвращает действительный JSON... Возможно, BOM в сгенерированном файле?   -  person user11153    schedule 10.06.2014
comment
ваш пример действителен JSON и json_decode() на нем работает. пожалуйста, предоставьте больше кода или пример, в котором json_decode() терпит неудачу.   -  person low_rents    schedule 10.06.2014
comment
Марк Б, выход var_dump($this->request->post['rules']) равен string(337) "{"IRIYL":{"id":"IRIYL","name":"Free","high":99999,"low":575,"amount":0,"type":1},"YWHDM":{"id":"YWHDM","name":"25%","high":575,"low":0,"amount":25,"type":1}}" Я не добавлял утилиту str_replace после того, как понял проблему, я удалил no , так как это не решило проблему.   -  person mbryant    schedule 11.06.2014
comment
zzzzBov, я пометил javascript, так как JSON создается с помощью js JSON.stringify(rules), но затем читается в PHP   -  person mbryant    schedule 11.06.2014


Ответы (1)


Кажется, OpenCart (или что-то еще) менял " (кавычки) на &quot;, тем самым нарушая JSON.

Я добавил следующую строку перед декодированием JSON, это устранило проблему.

$rules = str_replace('&quot;', '"', $rules);

person mbryant    schedule 11.06.2014