You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中使用JsonConvert遍历JSON异常:无法完整获取seatjson并传递

解析JSON获取完整seatjson对象的解决方案

看起来你现在碰到的问题是:明明JSON里的seatjson是一个完整对象,但用dynamic反序列化后,只能拿到它的单个属性,没法把整个对象传给BookSeats函数对吧?咱们来一步步解决这个问题:

先排查代码里的核心问题

你的JSON外层是数组结构(用[]包裹),用JsonConvert.DeserializeObject反序列化后,dynJson本质是一个IEnumerable<dynamic>。遍历逻辑本身没问题,但大概率是这两个原因导致拿不到完整对象:

  1. dynamic的隐式类型模糊性:dynamic在编译时没有明确类型提示,如果你直接传item.seatjson,可能编译器无法识别它是完整对象,或是BookSeats的参数类型和它不匹配。
  2. 反序列化前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:43