как исправить искаженный JSON в php

У меня есть эта строка 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 =, он пройдет проверку.

Исправление:

  1. Исправьте код, который генерирует строку json в первую очередь.

или

  1. используйте str_replace для изменения 'src \ =' to 'src ='

Проблема с неправильным кодированием заключается в том, что это просто неправильная кодировка. Вещи затем ломаются.

Если проблема связана с недействительными escape-последовательностями, как указал Бен в своем ответе, вы можете попытаться исправить входную строку для этих последовательностей, возможно, с более умным алгоритмом, который ищет любую ненужную escape-последовательность, заменяющую ее не- escape-значение, удалив escape-символ \ .

Вы можете сделать это, создав список символов, которые нужны для фактического экранирования, затем проанализируйте всю строку для escape-символа, если она найдена, проверьте, требует ли следующий символ или нет, а затем действовать.

Однако это только одна стратегия, и поскольку ввод неправильно закодирован, нелегко просто исправить ситуацию, потому что они уже сломаны.