为何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
相关产品推荐
相关产品推荐

