我正在学习使用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
我的字符串内容放入数组或字典中。
答案 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);