if (innerNode == null)
{
continue;
}
Debug.Log($"toNode type: {node["toNode"]?.GetType()}");
发现这个JToken 无法正确的判断 是否为 null,再排除逻辑问题后,我基本能确定的是 这个对象 不返回的不是真正的C# NULL
输出类型后是 Newtonsoft.Json.Linq.JValue
可知 最终 JValue 的 null 不能等于C# 的null
所以
JValue 的特殊性:
当 JSON 中显式定义 "toNode": null 时,Newtonsoft.Json 会将其解析为 JValue 类型(而非真正的 null)。
此时 node["toNode"] 是一个 JValue 对象,其 Value 属性为 null,但对象本身非 null。
因此 if (innerNode == null) 会返回 false(因为 JValue 对象存在),导致 continue 未触发。
JToken innerNode = next ? node["toNode"] : node;
if (innerNode == null || innerNode.Type == JTokenType.Null)
{
continue; // 正确处理显式 JSON null 值
}
string nodeId = node["id"]?.ToString();
if (nodeId != null)
{
Debug.Log($"{nodeId},{innerNode},{next}");
}