首页 新闻 搜索 专区 学院

json转化为对象时出错改了好多东西东都急急急急急急急急急急急急急急急急

0
悬赏园豆:10 [已解决问题] 解决于 2015-03-25 13:59

这是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;
}

在红色这句话报错啊

MingHao_Hu的主页 MingHao_Hu | 初学一级 | 园豆:8
提问于:2015-03-24 11:22
< >
分享
最佳答案
0

怎么用得这么复杂,直接:

T t = JsonConvert.Deserialize<T>(jsonString);

试试这样的代码,而且,你应该贴下错误代码。
收获园豆:10
幻天芒 | 高人七级 |园豆:36608 | 2015-03-24 12:23

下面是我的转化方法

 

 

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;
}

在红色这句话报错啊

MingHao_Hu | 园豆:8 (初学一级) | 2015-03-24 13:07

 数据是从前台js中获得的

MingHao_Hu | 园豆:8 (初学一级) | 2015-03-24 13:09

@MingHao_Hu: 你真的用得太复杂了。这就是一句话+一个实体就能搞定的。

看楼下:不要使用JObject和JArray这种外部类型,直接使用JsonConvert.Deserialize<T>(jsonString)来生成整个对象。这样就ok了~。

List<T> list = JsonConvert.Deserialize<List<T>>(jsonString)

幻天芒 | 园豆:36608 (高人七级) | 2015-03-24 13:14
其他回答(3)
0

建议使用Json.NET

dudu | 园豆:38805 (高人七级) | 2015-03-24 11:49

就是使用的newtonsoft。json不知道什么原因都搞了很久了

都无语了

 

支持(0) 反对(0) MingHao_Hu | 园豆:8 (初学一级) | 2015-03-24 11:59

有其他办法解决吗?

支持(0) 反对(0) MingHao_Hu | 园豆:8 (初学一级) | 2015-03-24 12:06
0

很明显,T的类型指定问题;

错误提示你传入一个JSON数组作为反序列化的对象,而你的jsonRsp[i]不是数组对象,这说明后面的typeof(T)中的T是一个数组类型。

解决办法:
1、在你创建了JArray之后,直接使用js反序列化出整个对象,无需使用for循环。
2、不要使用JObject和JArray这种外部类型,直接使用JsonConvert.Deserialize<T>(jsonString)来生成整个对象。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2015-03-24 13:08
0

在love编程有java相关的视频,,,自己学习一下吧

java探索者1 | 园豆:202 (菜鸟二级) | 2015-03-24 15:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册