Ошибка загрузки формы ошибка parsererror исключение invalid json

why this error

xhr: [object XMLHttpRequest]
textStatus: parsererror
errorThrown: Invalid JSON: [ { «id»: «10000000», «label»: «10000000» }, { «id»: «10000001», «label»: «10000001» }, { «id»: «10000003», «label»: «10000003» }, { «id»: «10000005», «label»: «10000005» }, { «id»: «10000006», «label»: «10000006» } ]

asked Nov 5, 2010 at 5:49

mohamedawads's user avatar

1

Copied and pasted this:

[ { "id": "10000000", "label": "10000000" }, { "id": "10000001", "label": "10000001" }, { "id": "10000003", "label": "10000003" }, { "id": "10000005", "label": "10000005" }, { "id": "10000006", "label": "10000006" }]

to JSONlint and it says it’s valid.

answered Nov 5, 2010 at 6:18

darioo's user avatar

darioodarioo

46.3k10 gold badges74 silver badges103 bronze badges

Can you post the original JSON if that is the original then the it is missing a root key

var textStatus = {"keys":[{"id":"...", "label":"..."},{"id":"...","label":"..."}]}

Also the whole thing needs to be inside {} to make it an object what you had is just an array

answered Nov 5, 2010 at 6:14

Cubed Eye's user avatar

Cubed EyeCubed Eye

5,5514 gold badges47 silver badges64 bronze badges

1

https://eso.stat.kz:455/testru.html

по такому адресу проводятся тестовые испытания новой электронной системы по сдаче электронной отчетности. Ранее Агентство по статистике уже предоставило нам программу ИС ЭСО. Теперь представляет программу, работающую в on-line режиме через Интернет прямо в браузере.

Прежде всего, хочется сказать, что сейчас новая электронная система работает в тестовом режиме. Поэтому реализована только одна форма: 1-ВТ, квартальная. Также ее пока нельзя отправить, а только заполнить и сохранить, экспортировав в Excel. Сейчас Вы сможете настроить свой компьютер, проверить какие есть проблемы и возможности.

Вообще по программам электронной статотчетности можно провести аналогию с налоговыми программами: ИС ЭСО это как программа ИС СОНО, т.е. ее надо устанавливать и обновлять каждый раз, а вот новая система работает как Кабинет налогоплательщика, т.е. его не надо обновлять, всё работает прямо в браузере. Поэтому в будущем можно будет сдавать статистическую отчетность электронном виде, причем как через программу ИС ЭСО, устанавливаемую на компьютер (аналог – СОНО), так и в on-line режиме, доступным по адресу:

http://www.stat.kz/on-line/Pages/default.aspx

(аналог Кабинета налогоплательщика).

Как работать в ИС ЭСО я рассматривал в предыдущей статье Как работать в ИС ЭСО для сдачи электронной отчетности. Теперь рассмотрим сдачу отчетов в on-line режиме. В принципе работа в программах электронной сдачи статотчетности несложна. Необходимо заполнить форму сдачи отчетности и отправить на сервер, подписав электронным сертификатом.

В обоих случаях (что для ИС ЭСО, что для новой on-line системы), для отправки электронной статотчетности необходим сертификат центра сертификации Республики Казахстан, который можно получить на сайте: pki.gov.kz . Если вы, например, пользуетесь порталом госзакупок, то значит, данные сертификаты у вас уже установлены и используются в браузере.

image053.jpg

Рис.1
Сразу хочется заметить, что для подписи сертификатом требуется программа Tumar, установка которой блокирует работу службы СГДС 3, а также возникают проблемы при установке новых сертификатов в кабинет налогоплательщика. Поэтому рекомендация, по возможности данную программу ставить на отдельный компьютер, а не на тот, на котором вы работаете с налоговыми программами.
Для работы в

https://eso.stat.kz:455/testru.html

необходимо скачать и установить Пакет Microsoft Sirverlight 4, программное обеспечение Capicom, а также необходима программа Tumar, о которой я говорил выше. Всё это можно найти на странице

http://www.stat.kz/on-line/Pages/default.aspx

Ставим по порядку: Microsoft Sirverlight 4 (Рис.2),

image001.jpg

Рис.2
Tumar (если у Вас на компьютере еще не настраивался Портал государственных закупок) и Capicom (Рис.3).

image002.jpg

Рис.3

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

Перед тем как начать работать, рекомендуется настроить браузер. На данный момент рекомендуется использовать Internet Explorer версии 6.0. В других браузерах возможно будет работать, возможно нет. Откройте браузер, зайдите в меню Сервис — Свойства обозревателя. Вкладку Безопасность, выберите пункт «Надежные узлы» и щелкните мышкой «Узлы» и в новом окне добавьте узлы:

Код: Выделить всё
https://eso.stat.kz:455/
https://www.stat.kz/
https://eso.stat.kz/

Сертификаты от Кабинета налогоплательщиков не подойдут.
После настройки данных программ можете заполнять формы, а в будущем и отправлять формы статистической отчетности. Пока в ней только форма 1-ВТ (Рис.4), но в будущем будут разрабатываться, и добавляться и другие формы на 2011, 2012 и т.д. года.

image003.jpg

Рис.4

Пока система eso.stat.kz:455 находится в стадии тестирования и у Вас есть возможность пока настроить и проверить работу. После тестирования система будет введена в работу.

***

Система внедрена в работу, тема на форуме: 1-ТС статистическая форма по Таможенному Союзу

Кроме формы 1-ТС, в режиме on-line можно сдать форму 1-ВТ, по адресу: http://www.stat.kz/on-line/Pages/1-TS.aspx, требования следующие:

1. Браузер Internet Explorer 6.0 и выше
2. Пакет Microsoft Sirverlight 4 (скачать архивный файл Sirverlight.rar)
3. Программное обеспечение криптопровайдера Tumar, размещенное на сайте Национального удостоверяющего центра (НУЦ).
4. Программное обеспечение Capicom (скачать архивный файл Capicom.rar)
5. Получить, установить сертификаты на основе алгоритмов RSA и ГОСТ, выдаваемые НУЦ. Выдача средств аутентификации и электронной цифровой подписи юридического лица осуществляется в Центрах регистрации Национального удостоверяющего центра, размещенных при Центрах обслуживания населения. Для этого необходимо свидетельство о государственной регистрации юридического лица содержащее бизнес-идентификационный номер (БИН). Перечень центров регистрации доступен на сайте Национального удостоверяющего центра.
6. В настройках браузера для сайта

https://eso.stat.kz:455

разрешить использование ActiveX компонентов и Javascript.

Обратите внимание, что в последнее время список отчетов, которые можно сдавать on-line по статистике значительно увеличился, это такие отчеты как например:
1-ИЖС, 1-кс (малые), 1-инвест, 1-кс, 1-Т, 1-туризм, 1-транспорт и многие другие. Полностью список отчетов на странице: http://www.stat.kz/on-line/Pages/default.aspx

У вас нет доступа для скачивания и просмотра вложений, документации, файлов, изображений в этом сообщении. Доступ для зарегистрированных пользователей. Вы можете бесплатно зарегистрироваться на нашем сайте. Если Вы зарегистрированы, то Вам необходимо нажать опцию «Вход» в вверху страницы (там же находится ссылка на страницу регистрации)

Последний раз редактировалось Senator_I 02 фев 2013, 11:02, всего редактировалось 3 раз(а).

Получив «parsererror» от jquery для запроса Ajax, я попытался изменить POST на GET, возвращая данные несколькими различными способами (создавая классы и т. Д.), Но я не могу понять, в чем проблема.

Мой проект в MVC3, и я использую jQuery 1.5. У меня выпадающий список, и в случае события onchange я запускаю вызов, чтобы получить данные, основанные на том, что было выбрано.

Раскрывающийся список: (загружает «Представления» из списка в Viewbag и запускает событие нормально)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

Javascript:

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

Приведенный выше код успешно вызывает метод MVC и возвращает:

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

Но jquery запускает событие ошибки для метода $.ajax(), говоря «parsererror».

2011-02-21 00:54

17
ответов

Решение

Я недавно столкнулся с этой проблемой и наткнулся на этот вопрос.

Я решил это гораздо проще.

Способ первый

Вы можете удалить dataType: 'json' свойство от объекта буквального…

Способ второй

Или вы можете делать то, что говорил @Sagiv, возвращая ваши данные как Json,


Причина этого parsererror возникает сообщение о том, что когда вы просто возвращаете строку или другое значение, это не совсем Json, так что синтаксический анализатор терпит неудачу при синтаксическом анализе.

Так что если вы удалите dataType: json свойство, оно не будет пытаться разобрать его как Json,

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

2012-07-16 15:33

Смотрите ответ @david-east, чтобы узнать, как правильно решить эту проблему.

Этот ответ имеет отношение только к ошибке в jQuery 1.5 при использовании протокола file:.

У меня недавно была похожая проблема при обновлении до jQuery 1.5. Несмотря на получение правильного ответа, обработчик ошибок сработал. Я решил это с помощью complete событие, а затем проверка значения состояния. например:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

2011-02-21 17:00

Вы указали dataType ответа на вызов ajax как:

‘JSON’

где фактический ответ ajax не является допустимым JSON, и в результате анализатор JSON выдает ошибку.

Лучший подход, который я бы порекомендовал, это изменить dataType на:

‘текст’

и в обратном вызове успеха проверьте, возвращается ли верный JSON или нет, и если проверка JSON не удалась, предупредите об этом на экране, чтобы было очевидно, для какой цели вызов ajax фактически не удался. Посмотри на это:

$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    dataType: 'text',
    data: {viewID: $("#view").val()},
    success: function (data) {
        try {
            var output = JSON.parse(data);
            alert(output);
        } catch (e) {
            alert("Output is not valid JSON: " + data);
        }
    }, error: function (request, error) {
        alert("AJAX Call Error: " + error);
    }
});

2017-05-31 11:03

Проблема в том, что ваш контроллер возвращает строку или другой объект, который не может быть проанализирован. Ожидается, что вызов Ajax вернет Json. попробуйте вернуть JsonResult в контроллер следующим образом:

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

Надеюсь, поможет:)

2011-06-13 12:07

Есть много предложений, чтобы удалить

dataType: "json"

Хотя я допускаю, что это работает, это игнорирует основную проблему. Если вы уверены, что возвращаемая строка действительно является JSON, тогда ищите ошибочные пробелы в начале ответа. Подумайте о том, чтобы взглянуть на это в Fiddler. Моя выглядела так:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":"./output/ou...

В моем случае это была проблема с PHP, извергающим нежелательные символы (в данном случае спецификации файлов UTF). После того, как я удалил их, это решило проблему, сохраняя при этом

dataType: json

2015-07-17 16:34

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

2014-03-25 09:29

Я столкнулся с той же проблемой. Для решения своей проблемы я решил использовать двойные кавычки вместо одинарных.

      echo "{'error':'Sorry, your file is too large. (Keep it under 2MB)'}";
-to-
echo '{"error":"Sorry, your file is too large. (Keep it under 2MB)"}';

2021-06-09 22:48

в случае операции Get из веб.net mvc/api, убедитесь, что вы можете получить

     return Json(data,JsonRequestBehavior.AllowGet);

2016-08-04 08:03

Я также получаю «Запрос возврата с ошибкой:parsererror». в консоли JavaScript. В моем случае это был не вопрос Json, но мне пришлось передать в текстовую область просмотра действительную кодировку.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);

2017-09-26 15:59

Я столкнулся с такой ошибкой, но после изменения моего ответа перед отправкой клиенту он работал нормально.

//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response);  // Sending to client

//Client side
success: function(res, status) {
    response = JSON.parse(res); // Getting as expected
    //Do something
}

2019-02-01 07:15

Я не знаю, если это все еще актуально, но проблема была с кодировкой. Переход на ANSI решил проблему для меня.

2015-05-09 16:20

Если вы получили эту проблему, используя HTTP GET в IE, я решил эту проблему, установив кеш: false. Так как я использовал один и тот же URL для запросов HTML и json, он попал в кеш вместо выполнения вызова json.

$.ajax({
    url: '/Test/Something/',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
});

2015-06-19 10:50

Вы должны удалить dataType: «JSON». Затем посмотрите на магию… причина этого заключается в том, что вы конвертируете объект json в простую строку… так что анализатор json не может проанализировать эту строку из-за того, что он не является объектом json.

this.LoadViewContentNames = function () {
$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
 });
};

2016-03-29 19:44

У меня была такая же проблема, получилось мое web.config было не то же самое с моими партнерами по команде. Поэтому, пожалуйста, проверьте ваш web.config,

Надеюсь, это кому-нибудь поможет.

2019-02-21 06:20

Эта проблема

window.JSON.parse вызывает ошибку в функции $.parseJSON.

<pre>
$.parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
</pre>

Мое решение

Перегрузка JQuery с помощью инструмента requirejs.

<pre>
define(['jquery', 'jquery.overload'], function() { 
    //Loading jquery.overload
});
</pre>

Содержимое файла jquery.overload.js

<pre>
define(['jquery'],function ($) { 

    $.parseJSON: function( data ) {
        // Attempt to parse using the native JSON parser first
        /**  THIS RAISES Parsing ERROR
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }
        **/

        if ( data === null ) {
            return data;
        }

        if ( typeof data === "string" ) {

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim( data );

            if ( data ) {
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                    .replace( rvalidtokens, "]" )
                    .replace( rvalidbraces, "")) ) {

                    return ( new Function( "return " + data ) )();
                }
            }
        }

        $.error( "Invalid JSON: " + data );
    }

    return $;

});
</pre>

2013-03-10 23:31

Если вы не хотите удалять / изменятьdataType: json, вы можете переопределить строгий анализ jQuery, определив пользовательский converter:

$.ajax({
    // We're expecting a JSON response...
    dataType: 'json',

    // ...but we need to override jQuery's strict JSON parsing
    converters: {
        'text json': function(result) {
            try {
                // First try to use native browser parsing
                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
                    return JSON.parse(result);
                } else {
                    // Fallback to jQuery's parser
                    return $.parseJSON(result);
                }
            } catch (e) {
               // Whatever you want as your alternative behavior, goes here.
               // In this example, we send a warning to the console and return 
               // an empty JS object.
               console.log("Warning: Could not parse expected JSON response.");
               return {};
            }
        }
    },

    ...

Используя это, вы можете настроить поведение, когда ответ не может быть проанализирован как JSON (даже если вы получаете пустое тело ответа!)

С этим пользовательским конвертером .done()/success будет сработать, если в противном случае запрос был успешным (код ответа 1xx или 2xx).

2017-06-14 22:22

получал «parsererror» от jquery для запроса Ajax, я попытался изменить сообщение на GET, возвращая данные несколькими различными способами (создание классов и т. д.) но я не могу понять, в чем проблема.

мой проект находится в MVC3, и я использую jQuery 1.5
У меня есть раскрывающийся список, и в событии onchange я запускаю вызов, чтобы получить некоторые данные на основе того, что было выбрано.

выпадающий список: (это загружает «представления» из списка в Viewbag и стрельбы мероприятие отлично работает)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

Javascript:

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

приведенный выше код успешно вызывает метод MVC и возвращает:

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

но jquery запускает событие ошибки для $.метод ajax (), говорящий «parsererror».

14 ответов


Я недавно сталкивался с этой проблемой и наткнулся на этот вопрос.

я решил это гораздо более простым способом.

Способ Один

вы можете либо удалить dataType: 'json' свойство из литерала объекта…

Способ

или вы можете сделать то, что @Sagiv говорил, вернув свои данные как Json.

причина parserror сообщение происходит, когда вы просто вернуть строке или другое значение, это не реально Json, поэтому синтаксический анализатор не работает при его анализе.

Итак, если вы удалите dataType: json собственность, он не будет пытаться разобрать его как Json.

С другим методом, если вы обязательно вернете свои данные как Json парсер будет знать, как правильно ее обрабатывать.


посмотреть ответ @david-east для правильного способа справиться с проблемой

этот ответ имеет отношение только к ошибка с jQuery 1.5 при использовании файла: протокол.

недавно у меня была аналогичная проблема при обновлении до jQuery 1.5. Несмотря на получение правильного ответа обработчик ошибок уволен. Я решил это, используя complete событие, а затем проверка значения состояния. е.г:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

вы указали ответ вызова ajax тип as:

‘json’

где как фактический ответ ajax не является допустимым JSON, и в результате парсер JSON выдает ошибку.

лучший подход, который я бы порекомендовал изменить тип в:

‘text’

и в успешном обратном вызове проверьте, возвращается ли допустимый JSON или нет, и если проверка JSON терпит неудачу, предупредите его на экране, чтобы было очевидно, с какой целью вызов ajax на самом деле терпит неудачу. Взгляните на это:

$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    dataType: 'text',
    data: {viewID: $("#view").val()},
    success: function (data) {
        try {
            var output = JSON.parse(data);
            alert(output);
        } catch (e) {
            alert("Output is not valid JSON: " + data);
        }
    }, error: function (request, error) {
        alert("AJAX Call Error: " + error);
    }
});

проблема в том, что ваш контроллер возвращает строку или другой объект, который не может быть проанализирован.
вызов ajax ожидал получить JSON взамен. попробуйте вернуть JsonResult в контроллере так:

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

надеюсь, что это помогает :)



есть много предложений снять

dataType: "json"

хотя я допускаю, что это работает, он игнорирует основную проблему. Если вы уверены, что возвращаемая строка действительно является JSON, то найдите блуждающие пробелы в начале ответа. Подумайте о том, чтобы взглянуть на него в fiddler. Моя выглядела так:—4—>

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":"./output/ou...

в моем случае это была проблема с PHP, извергающим нежелательные символы (в этом случае UTF-файл BOMs). Как только я удалил их, это исправило проблему, пока также сохраняя

dataType: json

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


Я не знаю, если это все еще актуально, но проблема была с кодированием. Переход на ANSI решил проблему для меня.

0

автор: George Dgebuadze


Если вы получаете эту проблему с помощью HTTP GET in IE, я решил эту проблему, установив кэш: false.
Поскольку я использовал один и тот же url для запросов HTML и JSON, он попал в кэш вместо вызова json.

$.ajax({
    url: '/Test/Something/',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
});

вы должны удалить тип данных: «json». Тогда посмотри на магию… причина этого заключается в том, что вы конвертируете объект json в простую строку.. поэтому парсер JSON не смогла разобрать эту строку с JSON-объект.

this.LoadViewContentNames = function () {
$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
 });
};

в случае операции Get из web .net mvc / api убедитесь, что вы разрешаете get

     return Json(data,JsonRequestBehavior.AllowGet);

Я также получал » возврат запроса с ошибкой: parsererror.»в консоли JavaScript.
В моем случае это не было вопросом Json, но я должен был передать в текстовую область просмотра допустимую кодировку.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);

проблема

окно.формат JSON.синтаксический анализ вызывает ошибку в $.функция parseJSON.

<pre>
$.parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
</pre>

мое решение

перегрузка JQuery с помощью requirejs инструмент.

<pre>
define(['jquery', 'jquery.overload'], function() { 
    //Loading jquery.overload
});
</pre>

С помощью jQuery.перегрузка.содержимое файла js

<pre>
define(['jquery'],function ($) { 

    $.parseJSON: function( data ) {
        // Attempt to parse using the native JSON parser first
        /**  THIS RAISES Parsing ERROR
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }
        **/

        if ( data === null ) {
            return data;
        }

        if ( typeof data === "string" ) {

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim( data );

            if ( data ) {
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                    .replace( rvalidtokens, "]" )
                    .replace( rvalidbraces, "")) ) {

                    return ( new Function( "return " + data ) )();
                }
            }
        }

        $.error( "Invalid JSON: " + data );
    }

    return $;

});
</pre>

-1

автор: Christian MEROUR


если вы не хотите удалять/менять dataType: json, вы можете переопределить строгий синтаксический анализ jQuery, определив пользовательский converter:

$.ajax({
    // We're expecting a JSON response...
    dataType: 'json',

    // ...but we need to override jQuery's strict JSON parsing
    converters: {
        'text json': function(result) {
            try {
                // First try to use native browser parsing
                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
                    return JSON.parse(result);
                } else {
                    // Fallback to jQuery's parser
                    return $.parseJSON(result);
                }
            } catch (e) {
               // Whatever you want as your alternative behavior, goes here.
               // In this example, we send a warning to the console and return 
               // an empty JS object.
               console.log("Warning: Could not parse expected JSON response.");
               return {};
            }
        }
    },

    ...

используя это, вы можете настроить поведение, когда ответ не может быть проанализирован как JSON (даже если вы получите пустое тело ответа!)

С помощью этого пользовательского конвертера,.done()/success будет срабатывать до тех пор, пока запрос был в противном случае успешным (код ответа 1xx или 2xx).


Describe the bug

The new JSON parser throws an exception when you input invalid JSON and try to deserialize it. That might be expected behavior, but it results in a problem when using the parser as an input formatter: a 500 internal server error.

To Reproduce

I’m using ASP.NET Core 3 preview 6.

Take this controller & dummy class code:

    [ApiController]
    [Route("api/bugs")]
    public class BugsController : ControllerBase
    {
        [HttpPost]
        public ActionResult<Dummy> CreateSomething(Dummy thingToCreate)
        {
            // ...
            return Ok();
        }
    }

    public class Dummy
    {
        public DateTimeOffset SomeDate { get; set; }
    }

Use a tool like Postman to POST something that can’t be deserialized into «Dummy», eg:

POST http://localhost:51044/api/bugs
{
	"someDate": "invalid value"
}

Result: 500 internal server error with the full stacktrace in the response body:

System.Text.Json.JsonException: The JSON value could not be converted to System.DateTimeOffset. Path: $.someDate | LineNumber: 1 | BytePositionInLine: 28.
   at System.Text.Json.ThrowHelper.ThowJsonException(String message, Utf8JsonReader& reader, String path)
   at System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType, Utf8JsonReader& reader, String path)
   at System.Text.Json.Serialization.JsonPropertyInfoNotNullable`3.Read(JsonTokenType tokenType, ReadStack& state, Utf8JsonReader& reader)
   at System.Text.Json.Serialization.JsonSerializer.HandleValue(JsonTokenType tokenType, JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& state)
   at System.Text.Json.Serialization.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
   at System.Text.Json.Serialization.JsonSerializer.ReadCore(JsonReaderState& readerState, Boolean isFinalBlock, Span`1 buffer, JsonSerializerOptions options, ReadStack& readStack)
   at System.Text.Json.Serialization.JsonSerializer.ReadAsync[TValue](Stream utf8Json, Type returnType, JsonSerializerOptions options, CancellationToken cancellationToken)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
   at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.BindModelAsync(ModelBindingContext bindingContext)
   at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Expected behavior

I would expect POSTing something that can’t be deserialized to result in the object «thingToCreate» being null as is the case in Core 2.x. Optionally an automated 400 Bad Request could also be returned, maybe via the ApiController attribute. But just throwing the exception which results in a 500 Internal Server Error goes against the HTTP Standard as inputting an invalid value when POSTing is a client mistake (status code range 4xx), not a server mistake (status code range 5xx).

Понравилась статья? Поделить с друзьями:
  • Ошибка загрузки форм соно windows 10
  • Ошибка загрузки фно в соно
  • Ошибка загрузки файлов с флешки
  • Ошибка загрузки файлов операционной системы
  • Ошибка загрузки файлов на сайт налоговой