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

如何判断动态字典值是否为数组并处理空数组问题

问题:动态类型空数组取值报错的解决方法

我用Jil解析第三方API返回的JSON,处理成字典和动态对象后,遇到一个问题:当动态对象里的数组属性为空时,直接取第一个元素会报错。

序列化处理代码

var res = await APICall();
var bookingTypes = Jil.JSON.DeserializeDynamic(res)["Bookings"][0];
var bookingData = (IDictionary<string, object>)bookingTypes;

出错的取值代码

string test = bookingData.ContainsKey("OrderCodes") ? bookingTypes.OrderCodes?[0] : "";

当bookingTypes.OrderCodes是空数组[]时,因为是动态值,无法直接检查数组长度,导致取值报错。


更新1:API响应示例

{
   "Bookings":[
      {
         "PersonalID":1025,
         "Name":"Brian K. Thomas",
         "OrderCodes":[
            
         ],
         "PrevOrders":[
            2390,
            3115
         ]
      }
   ]
}

更新2:即时窗口调试信息

bookingData.TryGetValue("PrveOrders", out object kws4);
true
kws4
{[239]}
    Dynamic View: Expanding the Dynamic View will get the dynamic members for the object
bookingData.TryGetValue("OrderCodes", out object kws5);
true
kws5
{[]}
    Dynamic View: Expanding the Dynamic View will get the dynamic members for the object

解决方法

方法1:转换为可枚举类型后判断

把动态数组对象转换为IEnumerable<object>,通过FirstOrDefault()安全获取第一个元素:

string test = "";
if (bookingData.ContainsKey("OrderCodes"))
{
    var orderCodes = bookingTypes.OrderCodes as IEnumerable<object>;
    test = orderCodes?.FirstOrDefault()?.ToString() ?? "";
}

方法2:通过字典取值后强转为数组

利用已有的bookingData字典,取出值后强转为数组,判断长度再取值:

string test = "";
if (bookingData.TryGetValue("OrderCodes", out var orderCodesObj))
{
    var orderCodes = orderCodesObj as object[];
    test = orderCodes?.Length > 0 ? orderCodes[0].ToString() : "";
}

方法3:强类型反序列化(推荐)

如果API响应结构固定,定义对应实体类,用强类型反序列化彻底避免动态类型的问题:

public class Booking
{
    public int PersonalID { get; set; }
    public string Name { get; set; }
    public List<string> OrderCodes { get; set; }
    public List<int> PrevOrders { get; set; }
}

public class ApiResponse
{
    public List<Booking> Bookings { get; set; }
}

// 反序列化代码
var res = await APICall();
var apiResponse = Jil.JSON.Deserialize<ApiResponse>(res);
var booking = apiResponse.Bookings[0];
string test = booking.OrderCodes?.FirstOrDefault() ?? "";

内容的提问来源于stack exchange,提问作者user2837480

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:17:40