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

如何在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))
    {
        // 后续业务逻辑处理
    }
}

关键修改说明

  1. 精准定位上层节点:不再全局遍历所有后代,而是先从symbols数组中筛选出symbol=BTCUSDT且contractType=PERPETUAL的对象,避免无效遍历。
  2. 链式筛选过滤器:通过SelectMany取出目标symbol的filters数组,再筛选filterType=MARKET_LOT_SIZE的节点,逻辑清晰且性能更优。
  3. 空值安全处理:使用?.运算符避免空引用异常,提升代码稳定性。

内容的提问来源于stack exchange,提问作者Mr.Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:54:23