如何判断动态字典值是否为数组并处理空数组问题
问题:动态类型空数组取值报错的解决方法
我用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
相关产品推荐
相关产品推荐

