首页新闻找找看学习计划

为什么C#反序列化json为对象遇到空的数组失败

0
悬赏园豆:100 [已解决问题] 解决于 2017-01-05 20:50

json字符串是这样的

{"result":"1","info":"","jj":[],"nomal":[],"jjcount":0,"nomalcount":1}

 

反序列化的时候就报错了,提示json基元有误;

 

当json字符串为这样的时候可以反序列化

{"result":"1","info":"","jj":[{"taskno":"117010500037","car_num":"沪NT0898","hktime":"31","jjbj":"0"}],"nomal":[{"taskno":"117010500037","car_num":"沪NT0898","hktime":"31","jjbj":"0"}],"jjcount":0,"nomalcount":1}

 反序列化的方法是

复制代码
       
 public static T Deserialize<T>(string sJson) where T : class
 {
    System.Web.Script.Serialization.JavaScriptSerializer script = new System.Web.Script.Serialization.JavaScriptSerializer();
     return script.Deserialize<T>(sJson);
}

 CarClass cc = Deserialize<CarClass>(reslut);
复制代码

报错信息如下:

捕捉到 System.ArgumentException
Message=无效的 JSON 基元: 。
Source=System.Web.Extensions
StackTrace:
在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
InnerException:

 

 难度list个数为0的时候就不能被反序列化?求打救!!!

 

问题补充:

我的类这样写的

public class CarClass
{
public string result { get; set; }
public string info { get; set; }
public List<car> jj { get; set; }
public List<car> nomal { get; set; }
public int jjcount { get; set; }
public int nomalcount { get; set; }

public CarClass()
{ 
}
}

public class car
{
public string taskno { get; set; }
public string car_num { get; set; }
public string hktime { get; set; }
public string jjbj { get; set; }

public car()
{ 
}
}

 

 

 

寒子非的主页 寒子非 | 初学一级 | 园豆:112
提问于:2017-01-05 17:27
< >
分享
最佳答案
1

System.Runtime.Serialization.Json.DataContractJsonSerializer json = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(CarClass));
            CarClass source = (CarClass)json.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(result)));

一点压力都没有啊。

收获园豆:80
wangjinming | 菜鸟二级 |园豆:369 | 2017-01-05 18:26

谢谢,终于知道原因了,我把项目架构改成framework .NET4.0就可以了,之前的方法也是可行的。是你帮忙找出了原因,所以分给你。

寒子非 | 园豆:112 (初学一级) | 2017-01-05 20:48
其他回答(5)
0

为什么一定要传一个空的数组呢。为空的时候不传不行吗

青语 | 园豆:1000 (小虾三级) | 2017-01-05 17:29

有两个数组,其中一个为空的时候就序列化不了

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:32

@寒子非: 对啊,所以说你加个判断,如果[]是个空数组就不进行序列化。或者数组个数为零的话,就把[]用“”  或者 null 替代.

支持(0) 反对(0) 青语 | 园豆:1000 (小虾三级) | 2017-01-05 17:36

@唯忆青语: 序列化成json不是我写的,我这边只是负责把json反序列化成对象,他这样的json格式也是没错的

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:38

@寒子非: 你看下这个对你有没有帮助 http://bbs.csdn.net/topics/391971354

支持(0) 反对(0) 青语 | 园豆:1000 (小虾三级) | 2017-01-05 17:58
0

s实体类呢,肯定是可以的.空数组和空是2回事.但肯定没问题的

吴瑞祥 | 园豆:28729 (高人七级) | 2017-01-05 17:36

我也很奇怪,数组元素个数不为0的时候是可以反序列化的,只有其中一个数组的元素个数为0的时候就报错了

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:42

@寒子非: 用json.net试试吧.大家都用json.net的.这种情况是可以的序列化的

支持(0) 反对(0) 吴瑞祥 | 园豆:28729 (高人七级) | 2017-01-05 17:48

@吴瑞祥: 也试过了

JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings();
//jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
//DateFormatHandling = DateFormatHandling.IsoDateFormat,
jsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
jsonSerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;
jsonSerializerSettings.ObjectCreationHandling = ObjectCreationHandling.Auto;
jsonSerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
cc = JsonConvert.DeserializeObject<CarClass>(reslut,jsonSerializerSettings);//

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 18:05

@寒子非: 弄那么多配置干嘛...直接范序列化试试.不行的话把list改成[]试试

支持(0) 反对(0) 吴瑞祥 | 园豆:28729 (高人七级) | 2017-01-05 18:45

@吴瑞祥: 谢谢,终于知道原因了,我把项目架构改成framework .NET4.0就可以了

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 20:51
0

这是C#?Java吧?这个字符串可以正确被解析为JSON

创心coder | 园豆:736 (小虾三级) | 2017-01-05 17:37

json的格式没错,但是我反序列化的时候报错

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:41
0

用的什么方法反序列化的?

让我发会呆 | 园豆:2629 (老鸟四级) | 2017-01-05 17:38

public static T Deserialize<T>(string sJson) where T : class { System.Web.Script.Serialization.JavaScriptSerializer script = new System.Web.Script.Serialization.JavaScriptSerializer(); return script.Deserialize<T>(sJson); } CarClass cc = Deserialize<CarClass>(reslut);

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:40

@寒子非: 不明觉厉,你给car加个构造方法试试

支持(0) 反对(0) 让我发会呆 | 园豆:2629 (老鸟四级) | 2017-01-05 17:45

@让我发会呆: 还是不行

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:48

@寒子非: 加个无参数的构造

支持(0) 反对(0) 让我发会呆 | 园豆:2629 (老鸟四级) | 2017-01-05 17:53

@让我发会呆: 加的就是无参构造函数

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 17:55
1

把List<>换成数组试试

收获园豆:20
Daniel Cai | 园豆:10374 (专家六级) | 2017-01-05 18:10

一样是不行

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 18:17

@寒子非: 我用了你的代码及json字符串试了下,发现是正常的啊。

支持(0) 反对(0) Daniel Cai | 园豆:10374 (专家六级) | 2017-01-05 18:29

@Daniel Cai: 谢谢,终于知道原因了,我把项目架构改成framework .NET4.0就可以了,是楼下帮忙找出了重要原因,所以分只能给楼下了。

支持(0) 反对(0) 寒子非 | 园豆:112 (初学一级) | 2017-01-05 20:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册