如何在C#中通过JSON.Net筛选指定条件的JSON数据获取maxQty
问题与解决方案
问题描述
参考Stack Overflow线程实现JSON子节点访问,现有代码可获取MARKET_LOT_SIZE类型的节点,但未对上层节点做校验。需要精准获取symbol为BTCUSDT且contractType为PERPETUAL的MARKET_LOT_SIZE节点中的maxQty值,需补充过滤条件。
原有代码
var result = await response.Content.ReadAsStringAsync(); var jsonData = (JObject)JsonConvert.DeserializeObject(result); var doc = (JContainer)jsonData["symbols"]; var results = doc.Descendants() .OfType<JObject>() .Where(x => x["filterType"] != null && x["filterType"].Value<string>() == "MARKET_LOT_SIZE").ToList();
修改后的完整代码
var result = await response.Content.ReadAsStringAsync(); var jsonData = (JObject)JsonConvert.DeserializeObject(result); // 先筛选符合条件的symbol节点,再定位对应的MARKET_LOT_SIZE过滤器 var targetFilter = jsonData["symbols"] .OfType<JObject>() // 过滤symbol和contractType .Where(symbol => symbol["symbol"]?.Value<string>() == "BTCUSDT" && symbol["contractType"]?.Value<string>() == "PERPETUAL") // 取出该symbol的filters数组 .SelectMany(symbol => symbol["filters"].OfType<JObject>()) // 过滤MARKET_LOT_SIZE类型的过滤器 .Where(filter => filter["filterType"]?.Value<string>() == "MARKET_LOT_SIZE") .FirstOrDefault(); // 提取maxQty值 if (targetFilter != null) { var maxQty = targetFilter["maxQty"]?.Value<string>(); // 可按需转换为数值类型 if (decimal.TryParse(maxQty, out decimal maxQtyDecimal)) { // 后续业务逻辑处理 } }
关键修改说明
- 精准定位上层节点:不再全局遍历所有后代,而是先从
symbols数组中筛选出symbol=BTCUSDT且contractType=PERPETUAL的对象,避免无效遍历。 - 链式筛选过滤器:通过
SelectMany取出目标symbol的filters数组,再筛选filterType=MARKET_LOT_SIZE的节点,逻辑清晰且性能更优。 - 空值安全处理:使用
?.运算符避免空引用异常,提升代码稳定性。
内容的提问来源于stack exchange,提问作者Mr.Kim
相关产品推荐
相关产品推荐

