#php #json #api
Возникла проблема - API отдаёт данные в JSON формате, примерно в таком виде: { messages: [ { channel: "79991234567", phone: "79117777777", dateTime: 1544844684000, type: 1, status: 99, text: "Добрый день" }, { channel: "79991234567", phone: "79117777777", dateTime: 1544849654000, type: 5, status: 2, text: "", content: "https://app.wazzup24.com/api/v1/store/07146d53b21e4a41aca49b6bc2391c7e8100b6dac6df" } ], statuses: [ { messageId: "7271506a-1959-4e39-acaf-2ccc19d77ef2", status: 3 } ], channels: [ { channel: "79991234567", state: "active" } ] } Полученные данные нужно обработать через PHP и я пробовал сделать это через json_decode, но эта функция не возвращала никаких данных. После некоторого поиска и просмотра примеров, я понял, что причина скорее всего в том, что это JS-объект, но он не валиден как JSON, т.к. ключи и некоторые свойства не обёрнуты в кавычки. Можно ли как-то еще решить эту проблему? Заранее спасибо.
Ответы
Ответ 1
ОТВЕТ СОДЕРЖИТ ОШИБКУ В массивах строками становятся числа (а отрицательные вообще всё ломают), null и true/false. Если разница по сравнению с json'ом только в том, что часть ключей написаны без кавычек, а всё остальное соответствует формату JSON, то это легко исправляется заменой по регулярному выражению (?:"((?:\\.|.)*)"|([.\w]+))(\s*:\s*(?:[[{]|"(?:\\.|.)*"|[-.\w]+))? на "$1$2"$3. Вот пример на JS: var str = document.querySelector('textarea').value var json = str.replace(/(?:"((?:\\.|.)*)"|([.\w]+))(\s*:\s*(?:[[{]|"(?:\\.|.)*"|[-.\w]+))?/g, '"$1$2"$3') console.log(JSON.parse(json)) .as-console-wrapper.as-console-wrapper { max-height: 100vh }Ответ 2
Проблема решена, всем спасибо за ответы. При дальнейших поисках оказалось, что я был неправ: проблема не в том, что названия не обёрнуты в кавычки, а в том, что, как я узнал, PHP по умолчанию не парсит запросы кроме application/x-www-form-urlencoded multipart/form-data. В моем случае отправлялся запрос application/json и когда я пытался, получить к нему доступ из массива $_POST возвращался пустой массив. Помогло решение от @E_p (из вопроса Получение данных, отправляемых POST в виде json): $postData = file_get_contents('php://input'); $data = json_decode($postData, true); В моем случае это сработало. Еще раз спасибо всем за участие!
Комментариев нет:
Отправить комментарий