Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Возможно ли декодировать? (https://javascript.ru/forum/misc/73601-vozmozhno-li-dekodirovat.html)

ivnjavascript 27.04.2018 20:46

Возможно ли декодировать?
 
Добрый день.
Возможно ли декодировать следующие строки возвращающиеся после POST запроса?:
{
"errors": "{\"count\": [{\"message\": \"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\", \"code\": \"required\"}], \"email\": [{\"message\": \"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\", \"code\": \"required\"}], \"count_man\": [{\"message\": \"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\", \"code\": \"required\"}]}",
    "success": false
}

Заранее спасибо.

Aetae 27.04.2018 21:29

var errors = JSON.parse({
"errors": "{\"count\": [{\"message\": \"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\", \"code\": \"required\"}], \"email\": [{\"message\": \"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\", \"code\": \"required\"}], \"count_man\": [{\"message\": \"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435\\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\", \"code\": \"required\"}]}",
    "success": false
}['errors']);

alert(JSON.stringify(errors, 0, '\t'))
Какие проблемы?
Только вот разбираться надо не тут, а на сервере - какого хрена он такую фигню творит и пакует json в json.

ivnjavascript 29.04.2018 19:30

Возможно ли по подробнее?
1. Что не так с JSON?
2. Для чего возвращать строки в таком виде:
"\\u041e\\u0431\\u044f\\u0437\\u0430\\u0442\\u0435 \\u043b\\u044c\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435.\"
и как их преобразовать?
Я как понимаю, на серваке русские символы преобразуются в такой вид, что бы можно было передать клиенту. И на клиенте нужно преобразовать.
Но пока не понятно что это за такой вид?
Вы предлагает вывести выставить табуляцию и вывести в более читабельный вид?

laimas 29.04.2018 20:01

Цитата:

Сообщение от ivnjavascript
Я как понимаю, на серваке русские символы преобразуются в такой вид, что бы можно было передать клиенту.

А с чего это вас волнует? Это Unicode, и никоим образом не ошибка, браузер отобразит именно русский текст. Если так принципиально и на сервере РНР и версии не ниже 5.4, то функция json_encode может принимать параметром константу JSON_UNESCAPED_UNICODE, с которой национальные символы не будут кодироваться в Unicode. Если на сервере иной язык, ищите в нем решение этого вопроса.

Aetae 29.04.2018 20:57

ivnjavascript, нет, проблема в другом:
У вас в json
{
    "errors": x,
    "success": false
}
на место x вкладывается в виде строки ещё один json
{
  "count": [
    {
      "message": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.", 
      "code": "required"
    }
  ], 
  "email": [
    {
      "message": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.", 
      "code": "required"
    }
  ], 
  "count_man": [
    {
      "message": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.", 
      "code": "required"
    }
  ]
}
Из-за чего возникает двойное переэкранирование (\\) и необходимость декодировать сначала ответ, а затем ещё и параметр.
Должно быть так:
{
  "errors": {
    "count": [
      {
        "message": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.", 
        "code": "required"
      }
    ], 
    "email": [
      {
        "message": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.", 
        "code": "required"
      }
    ], 
    "count_man": [
      {
        "message": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.", 
        "code": "required"
      }
    ]
  },
  "success": false
}
а не как у вас, тогда можно будет спокойно работать с объектом.

Конкретно же \uXXXX, как выше заметили - это стандартная юникод кодировка, при декодировании json браузером прозрачно становится обычной javascript строкой и не требует никаких дополнительных действий.

ivnjavascript 29.04.2018 21:09

Спасибо, теперь стало ясно.
Благодарю.:thanks:


Часовой пояс GMT +3, время: 04:01.