C#(ASP .NET)反序列化异常

时间:2015-07-02 19:17:42

标签: c# asp.net json angularjs serialization

我正在学习使用ASP.NET MVC和AngularJS。

首先,我们可以查看在服务器上执行POST请求的AngularJS代码:

$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)可以从JSON数组反序列化的列表。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。

有关如何修复它的任何想法?它应该是一个有效的JSON字符串,因为我没有在我的.cshtml上的JSON.stringify上收到任何错误。

我要做的是将unpack我的字符串内容放入数组或字典中。

1 个答案:

答案 0 :(得分: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);