C#中使用JsonConvert遍历JSON异常:无法完整获取seatjson并传递
解析JSON获取完整seatjson对象的解决方案
看起来你现在碰到的问题是:明明JSON里的seatjson是一个完整对象,但用dynamic反序列化后,只能拿到它的单个属性,没法把整个对象传给BookSeats函数对吧?咱们来一步步解决这个问题:
先排查代码里的核心问题
你的JSON外层是数组结构(用[]包裹),用JsonConvert.DeserializeObject反序列化后,dynJson本质是一个IEnumerable<dynamic>。遍历逻辑本身没问题,但大概率是这两个原因导致拿不到完整对象:
- dynamic的隐式类型模糊性:dynamic在编译时没有明确类型提示,如果你直接传
item.seatjson,可能编译器无法识别它是完整对象,或是BookSeats的参数类型和它不匹配。 - 反序列化前的JSON完整性:可以先加个断点或者日志,确认
savedseat.ToString()输出的JSON字符串是完整的,避免源数据本身就有缺失。
推荐的两种解决方法
方法一:用强类型类反序列化(最可靠)
dynamic虽然灵活,但很容易出现类型匹配问题,不如直接创建对应JSON结构的类,能确保稳定拿到完整的seatjson对象:
首先定义匹配JSON结构的类:
public class FlightSeatData { public string flightNumber { get; set; } public SeatJson seatjson { get; set; } } public class SeatJson { public decimal? totalBasePrice { get; set; } public decimal? totalPrice { get; set; } public decimal? totalTax { get; set; } // 补充seatjson里的其他属性,和JSON结构一一对应 }
然后修改反序列化与调用代码:
var flightSeatList = JsonConvert.DeserializeObject<List<FlightSeatData>>(savedseat.ToString()); foreach (var item in flightSeatList) { // 此时item.seatjson是完整的SeatJson对象,直接传给BookSeats即可 BookSeats(item.seatjson, PNR); }
方法二:坚持用dynamic的优化方案
如果不想改用强类型,可以用JObject包装一下,确保拿到完整对象:
var dynJson = JsonConvert.DeserializeObject<List<dynamic>>(savedseat.ToString()); foreach (var item in dynJson) { // 用JObject包装后,能明确是完整对象 var seatJsonObj = JObject.FromObject(item.seatjson); BookSeats(seatJsonObj, PNR); // 若BookSeats接受dynamic参数,直接传item.seatjson即可,同时确认函数参数类型是dynamic/object }
额外检查点
- 确认
BookSeats的第一个参数类型:如果参数是单个属性类型(比如decimal),那肯定只能拿到单个值,需要调整参数类型为SeatJson、dynamic或JObject。 - 断点查看
item.seatjson的结构:确认它包含所有预期属性,偶尔JSON属性名大小写不匹配也会导致取值失败(不过Json.NET默认大小写不敏感,还是要留意)。
内容的提问来源于stack exchange,提问作者Linta Sheelkumar
相关产品推荐
相关产品推荐

