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 и други подобни. тези функции не са безопасни за Unicode.   -  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