C # (ASP .NET) исключение десериализации

0

Я учусь использовать ASP.NET MVC с AngularJS.

Сначала мы можем взглянуть на мой код AngularJS, который выполняет запрос POST на сервере:

$http({
                method: 'POST',
                url: '/Test/PostForm',
                dataType: "json",
                headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8;' },
                data: $.param({
                    data: JSON.stringify($scope.productos),   
                }, true)
            })
            .success(function (data, status, headers, config) {
                console.log(data);
            })
            .error(function (data, status, headers, config) {
                console.log(data, status, headers, config);
            })

Где:

$scope.productos = [ {desc:"Product 1", cant: 10, cu:100}, {desc:"Product 2", cant: 10, cu:100}...]

Я решил использовать метод JSON.stringify в моем $scope.productos чтобы передать его моим действиям, как показано ниже:

public JsonResult PostForm(string data)
    {
        System.Diagnostics.Debug.WriteLine(data);
        Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); // Exception thrown here
        System.Diagnostics.Debug.WriteLine("-------------------");

        System.Diagnostics.Debug.WriteLine("-------------------");
        string[] arr = { "Success", "Los archivos han sido agregados correctamente" };
        return Json(arr, JsonRequestBehavior.DenyGet);
    }

Моя проблема возникает при попытке выполнить Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); поскольку я получаю исключение:

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип "System.Collections.Generic.Dictionary'2 [System.String, System.String]", поскольку для этого типа требуется объект JSON (например, {"name ":" value "}) для десериализации.

Чтобы исправить эту ошибку, измените JSON на объект JSON (например, {"name": "value"}) или измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), например List, который может десериализоваться из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON.

Любая идея о том, как это исправить? Он должен получить правильную строку JSON, так как я не получаю никаких ошибок в JSON.stringify на моем.cshtml.

Я пытаюсь unpack содержимое строки в массив или словарь.

Теги:
serialization

1 ответ

1
Лучший ответ

Во-первых, вам нужно определить класс для десериализации строки JSON. Например:

public class Producto 
{
     [JsonProperty("desc")]
     public string Descripcion{get;set;}

     [JsonProperty("cant")]
     public int Cantidad{get;set;}

     [JsonProperty("cu")]
     public int CostoPorUnidad{get;set;}
}

Затем вы можете десериализовать свою строку data в массив Producto:

var productos = JsonConvert.DeserializeObject<Producto[]>(data);

Или в словарь, используя некоторые LINQ:

var productos = JsonConvert.DeserializeObject<Producto[]>(data).ToDictionary(p=>p.Descripcion);
  • 0
    Работает как шарм! Я хочу еще раз JsonConvert документацию по JsonConvert чтобы лучше понять ее, но вы, несомненно, дали мне хорошую отправную точку. Большое спасибо @Diego

Ещё вопросы

Сообщество Overcoder
Наверх
Меню