Newtonsoft.Json反序列化后函数提前退出,未执行后续代码求助
问题排查与解决方案
这个问题的核心原因是JSON结构和你的C#类定义不匹配,导致反序列化过程中出现了隐藏的异常或对象状态异常,让代码看起来在foreach前“莫名退出”。我来一步步帮你分析和解决:
1. 最直接的问题:Transaction字段的类型不匹配
你的tranx类中定义的transaction是单个Transaction对象:
public class tranx { public Transaction transaction { get; set; } public List<LineItem> lineItems { get; set; } }
但前端传入的JSON里,transaction是数组类型(被[]包裹):
{ "transaction":[ { "entityID":"", "date":"2018-05-28" } ], "lineItems":[ ... ] }
Newtonsoft.Json默认不会因为这种类型不匹配直接抛出异常,但会把transaction属性赋值为null,更关键的是,这种不匹配可能触发了未被捕获的隐性异常,导致代码执行中断。
两种修正方案:
- 方案一:修改C#类适配JSON结构
如果业务上transaction确实是多个对象,把类中的字段改成集合类型:
public class tranx { public List<Transaction> transaction { get; set; } public List<LineItem> lineItems { get; set; } }
- 方案二:修改JSON适配类结构
如果业务上transaction应该是单个对象,让前端把JSON里的数组包裹去掉:
{ "transaction": { "entityID":"", "date":"2018-05-28" }, "lineItems":[ ... ] }
2. 捕获隐藏异常,明确问题
为了排查这类隐性问题,建议在反序列化代码周围加上try-catch块,捕获并查看具体异常信息:
[HttpGet] public ActionResult saveTransaction(string transactionJson) { try { tranx t = JsonConvert.DeserializeObject<tranx>(transactionJson); // 这里加断点,查看t的属性是否正确赋值 foreach (LineItem i in t.lineItems) { if (i != null) { Console.Write(i.CategoryID); } } } catch (Exception ex) { // 打印或记录异常信息,这能帮你快速定位问题 Console.WriteLine($"反序列化失败:{ex.Message}\n{ex.StackTrace}"); // 可以返回错误响应给前端,或者重新抛出异常 return BadRequest($"数据格式错误:{ex.Message}"); } return View(); }
3. 开启严格反序列化模式,提前发现问题
你可以配置Newtonsoft.Json的序列化设置,开启严格模式,让它在遇到结构不匹配时直接抛出异常,避免隐性问题:
var serializerSettings = new JsonSerializerSettings { // 遇到类中没有的JSON字段时抛出异常 MissingMemberHandling = MissingMemberHandling.Error, // 遇到null值时忽略(可选,根据你的业务需求调整) NullValueHandling = NullValueHandling.Ignore }; tranx t = JsonConvert.DeserializeObject<tranx>(transactionJson, serializerSettings);
4. 验证反序列化后的对象状态
在反序列化后加断点,仔细检查t对象的各个属性:
t.transaction是否为null或正确赋值?t.lineItems是否有数据?
这能帮你确认反序列化是否真的成功完成。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

