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

为何JObject.ContainsKey无法识别JToken.SelectToken可获取的嵌套键?

问题原因与解决方案

为什么ContainsKey("length.B1")总是失败?

JObject.ContainsKey()方法只能检查当前JObject层级下的直接键,它无法识别带点号的嵌套路径。你的TC对象是最外层节点,直接键只有"id"和"length","length.B1"并不是它的直接键——B1是length子对象(仅当length为对象类型时)里的键,所以ContainsKey永远找不到这个路径,返回false。

而JToken.SelectToken()支持用点号语法遍历嵌套JSON结构,因此能正确定位到length.B1的值(当对应嵌套结构存在时)。

正确处理方式

要安全获取length.B1的值,同时处理节点缺失或length为数值的情况,可参考以下代码:

public TrackCircuit(JObject TC) 
{
    short lengthB1 = -1; // 预设默认值
    
    // 通过SelectToken获取节点,判断非空后再转换类型
    var lengthB1Token = TC.SelectToken("length.B1");
    if (lengthB1Token != null && short.TryParse(lengthB1Token.ToString(), out short value))
    {
        lengthB1 = value;
    }
}

更简洁的写法(利用空合并运算符和类型转换):

public TrackCircuit(JObject TC) 
{
    short lengthB1 = TC.SelectToken("length.B1")?.Value<short>() ?? -1;
}

上述代码能覆盖三种场景:

  • length是纯数值(如S211):SelectToken返回null,最终赋值-1
  • length是对象但无B1键(如S213):SelectToken返回null,赋值-1
  • length是对象且包含B1键(如S212):正确获取对应数值

补充说明

若需单独判断嵌套路径是否存在,直接用SelectToken的返回值是否为null即可,无需使用ContainsKey:

bool hasLengthB1 = TC.SelectToken("length.B1") != null;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:26:58