这是json字符串
[{"GoodId":"44322078834","PropertyValues":"XS|蓝色花朵印花","Number":"7"},{"GoodId":"44322078834","PropertyValues":"S|蓝色花朵印花","Number":"7"},{"GoodId":"44322078834","PropertyValues":"M|蓝色花朵印花","Number":"7"},{"GoodId":"44322078834","PropertyValues":"L|蓝色花朵印花","Number":"7"},{"GoodId":"44322078834","PropertyValues":"XL|蓝色花朵印花","Number":"7"},{"GoodId":"44322078834","PropertyValues":"XXL|蓝色花朵印花","Number":"7"}]
下面是我的对象
public class AddCartModel
{
// [JsonConverter(typeof(SingleValueArrayConverter))]
[Required]
[JsonProperty("goodid")]
public string GoodId { get; set; }
[Required]
[JsonProperty("propertyvalues")]
public string PropertyValues { get; set; }
[JsonProperty("number")]
[Required]
public decimal Number { get; set; }
}
下面是专为过程中抱的错误
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[HaoDuoYi.WebUI.Models.AddCartModel]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path '[0]GoodId', line 1, position 11.
到底是什么原因的啊
下面是我的转化方法
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
//从请求中获取提交的参数数据
var json = controllerContext.HttpContext.Request.Form[bindingContext.ModelName] as string;
if (json == null) return null;
//提交参数是对象
if (json.StartsWith("{") && json.EndsWith("}"))
{
JObject jsonBody = JObject.Parse(json);
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonBody.CreateReader(), typeof(T));
return obj;
}
//提交参数是数组
if (json.StartsWith("[") && json.EndsWith("]"))
{
IList<T> list = new List<T>();
JArray jsonRsp = JArray.Parse(json);
if (jsonRsp != null)
{
for (int i = 0; i < jsonRsp.Count; i++)
{
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonRsp[i].CreateReader(), typeof(T));
list.Add((T)obj);
}
}
return list;
}
return null;
}
在红色这句话报错啊
怎么用得这么复杂,直接:
T t = JsonConvert.Deserialize<T>(jsonString);
试试这样的代码,而且,你应该贴下错误代码。
下面是我的转化方法
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
//从请求中获取提交的参数数据
var json = controllerContext.HttpContext.Request.Form[bindingContext.ModelName] as string;
if (json == null) return null;
//提交参数是对象
if (json.StartsWith("{") && json.EndsWith("}"))
{
JObject jsonBody = JObject.Parse(json);
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonBody.CreateReader(), typeof(T));
return obj;
}
//提交参数是数组
if (json.StartsWith("[") && json.EndsWith("]"))
{
IList<T> list = new List<T>();
JArray jsonRsp = JArray.Parse(json);
if (jsonRsp != null)
{
for (int i = 0; i < jsonRsp.Count; i++)
{
JsonSerializer js = new JsonSerializer();
object obj = js.Deserialize(jsonRsp[i].CreateReader(), typeof(T));
list.Add((T)obj);
}
}
return list;
}
return null;
}
在红色这句话报错啊
数据是从前台js中获得的
@MingHao_Hu: 你真的用得太复杂了。这就是一句话+一个实体就能搞定的。
看楼下:不要使用JObject和JArray这种外部类型,直接使用JsonConvert.Deserialize<T>(jsonString)来生成整个对象。这样就ok了~。
List<T> list = JsonConvert.Deserialize<List<T>>(jsonString)
建议使用Json.NET
就是使用的newtonsoft。json不知道什么原因都搞了很久了
都无语了
有其他办法解决吗?
很明显,T的类型指定问题;
错误提示你传入一个JSON数组作为反序列化的对象,而你的jsonRsp[i]不是数组对象,这说明后面的typeof(T)中的T是一个数组类型。
解决办法:
1、在你创建了JArray之后,直接使用js反序列化出整个对象,无需使用for循环。
2、不要使用JObject和JArray这种外部类型,直接使用JsonConvert.Deserialize<T>(jsonString)来生成整个对象。
在love编程有java相关的视频,,,自己学习一下吧