C#反序列化API返回的嵌套JSON数组报错,求问题排查
反序列化嵌套JSON的错误分析与修复方案
先看你拿到的JSON数据:
{ "rootEntity": "function", "count": 92516, "header": ["eventNumber", "startDate", "eventType"], "results": [ ["40262-1", "Tuesday, December 12, 2017", "Corporate"], ["14361-1", "Monday, October 23, 2017", "School"], ["5014-1", "Friday, October 13, 2017", "Birthday"] ] }
瞅了瞅你的代码,问题主要出在中间那串多余的字符串转换操作上,咱们一个个捋:
错误点分析
- 多余的字符串拼接:
String.Join("\\", jarr)完全是画蛇添足,这会把原本格式正常的JArray转换成混乱的字符串,后续反序列化肯定失败。JArray本身就能直接序列化为标准JSON,或者直接映射到实体类的集合属性,根本不需要这么折腾。 - 手动关闭流:
reader.Close()属于多此一举,你已经用了using块,它会自动帮你释放StreamReader资源(包括关闭流),手动调用反而可能引发不必要的问题。 - 错误的字符串修剪:
jsonString = jsonString.Trim('"');是基于前面错误的字符串操作的,结果只会让JSON格式更离谱,反序列化自然报错。
修复后的代码
首先得确保你的WebResp实体类和JSON结构对应正确:
public class WebResp { public string rootEntity { get; set; } public int count { get; set; } public List<string> header { get; set; } public List<List<string>> results { get; set; } }
然后直接反序列化整个JSON响应,跳过那些多余的中间步骤:
using (StreamReader reader = new StreamReader(responseStream)) { string jsonContent = reader.ReadToEnd(); var resp = JsonConvert.DeserializeObject<WebResp>(jsonContent); jsonResponse = resp.results.ToArray(); }
要是你只想单独处理results部分,也可以用JObject提取后直接反序列化:
using (StreamReader reader = new StreamReader(responseStream)) { JObject o = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); JArray jarr = (JArray)o["results"]; var results = jarr.ToObject<List<List<string>>>(); jsonResponse = results.ToArray(); }
这样操作完全贴合JSON的结构,就不会再出现反序列化错误啦。
内容的提问来源于stack exchange,提问作者Akshay Mishra
相关产品推荐
相关产品推荐

