2010-01-21 2 views
5

Я использую jQuery.ajax (...) для извлечения данных JSON из службы ASP.NET MVC. Когда сервер обнаруживает исключение, я посылаю 400 Bad статус Запроса обратно клиенту и отправить мое исключение как JsonResult:Как jQuery десериализовать JSON?

Response.StatusCode = 400; 
return Json(new { ex.Message, ex.StackTrace }); 

А вот мой JQuery код:

$.ajax(
{ 
    type: "POST", 
    url: deleteUrl, 
    dataType: "json", 
    data: 
    { 
     dataItems: dataItems, 
     toJSON: true 
    }, 
    success: function(msg) 
    { 
     alert(msg[i].dataItem); 
    }, 
    error: function(request, status, error) 
    { 
     alert(request.responseText); 
    } 
}); 

Мой ASP.NET код отправляет меня в раздел ошибки моего кода JavaScript, и блок ошибок позволяет мне читать request.responseText, а не работать с объектами, возвращаемыми с сервера.

Теперь, вместо того, чтобы добавить еще один JavaScript, включите что-то вроде json_parse и просто десериализуйте свое исключение, я бы хотел просто использовать тот же парсер JSON, который использует jQuery, хотя я не могу найти с готовностью найти информацию об этом ,

Может кто-нибудь указать мне в правильном направлении?

+0

Я нашел пост (http://www.west-wind.com/weblog/posts/324917.aspx) на блоге Рик Стрэхл, что объясняет: «Обратите внимание, что для функции ajaxJSON требуется кодировка JSON. JQuery не имеет каких-либо встроенных функций кодирования JSON (что кажется большим упущением, но, вероятно, было сделано для сохранения небольшого размера). Однако имеется ряд доступных JSON-реализаций. Выше я использую файл JSON2.js от Дугласа Крокфорда, чтобы сериализовать карту объектов параметров в JSON. " Мне показалось, что я прочитал это в jQuery 1.4 ... –

+2

. Что изменилось, jQuery теперь будет использовать 'JSON.parse' вместо' eval', если он будет доступен. jQuery никогда не предоставлял (и до сих пор не предоставляет) поддержку OOTB для сериализации JSON *. –

+0

@Crescent, который должен быть дан как ответ, а не комментарий. – Cheeso

ответ

6

jQuery использовался eval, если не ошибаюсь. Начиная с версии 1.4, он использует собственный десериализатор JSON, если он есть (например, в Firefox)

+0

Кто-нибудь знает, предоставил ли jQuery удобный метод для этого? –

+5

@Peder: yes, 'jQuery.httpData (request," json ")' вернет вам ваш обработанный объект JSON/JavaScript. –

+0

На самом деле, вам не нужно указывать «json»; httpData будет по умолчанию. – kgriffs

2

Я думаю, что в javascript, если у вас есть строка json, вы можете использовать eval для получения объекта, то есть:

var myObject = eval('(' + myJSONtext + ')'); 

есть больше информации об этом на http://www.json.org/js.html

+0

Не самый безопасный способ анализа данных. –

+0

На самом деле, я возвращаю то, что я сказал. Поскольку в этом случае я возвращаю только «безопасные» данные, а не данные, предоставленные пользователем, я могу безопасно десериализовать данные запроса с помощью eval. –

+0

В функции ошибки $ .ajax' вы можете использовать: 'function (xhr) {json = eval ('(' + xhr.responseText + ')'); ...}; ' – Natim

0

может быть, это может помочь вам. Я использую его, чтобы удалить комментарии и пробелы в моей JSON:

json = eval(o.responseText 
    .replace(/\/\*(.*)\*\/g, ' ') 
    .replace(/([^\:])\/\/[^\n]*\n/g, '$1') 
    .replace(/^\s|\s+|\s$/g, '')) 
+0

Комментарии не являются законными JSON в любом случае. Почему они возвращаются в ваш ответ? –

Смежные вопросы