У меня есть эта строка JSON, которую я хочу декодировать с помощью json_decode();
функция
{"phase":2,"id":"pagelet_profile_picture","css":["VCxcl","Ix2pq"],"js":["fZYUE","VfnZ3"],"content":{"pagelet_profile_picture":"\u003cdiv class=\"profile-picture\">\u003cspan class=\"profile-picture-overlay\">\u003c\/span>\u003cimg class=\"photo img\" src\=\"http:\/\/profile.ak.fbcdn.net\/hprofile-ak-snc4\/222_111_2222_n.jpg\" alt=\"bla bla\" id=\"profile_pic\" \/>\u003c\/div>"}}
существует json_last_error();
но это не помогает мне. (иногда появляются JSON_ERROR_STATE_MISMATCH и JSON_ERROR_SYNTAX)
Я хочу знать, что не так с этой строкой JSON и как я могу ее исправить автоматически в PHP, чтобы я мог ее декодировать. некоторый код будет очень полезен.
Используя json lint, кажется, проблема заключается в src \ =
\ экранирует знак =, что не имеет смысла.
Если вы замените src \ = на src =, он пройдет проверку.
Исправление:
или
Проблема с неправильным кодированием заключается в том, что это просто неправильная кодировка. Вещи затем ломаются.
Если проблема связана с недействительными escape-последовательностями, как указал Бен в своем ответе, вы можете попытаться исправить входную строку для этих последовательностей, возможно, с более умным алгоритмом, который ищет любую ненужную escape-последовательность, заменяющую ее не- escape-значение, удалив escape-символ \
.
Вы можете сделать это, создав список символов, которые нужны для фактического экранирования, затем проанализируйте всю строку для escape-символа, если она найдена, проверьте, требует ли следующий символ или нет, а затем действовать.
Однако это только одна стратегия, и поскольку ввод неправильно закодирован, нелегко просто исправить ситуацию, потому что они уже сломаны.