C#/.NET Core中读取含空格JSON键的正确方法
解决方法
带空格的JSON键名在Newtonsoft.Json的JObject中完全可以正常读取,你遇到的异常和键名带空格没有直接关系,是使用dynamic动态绑定时的类型推断错误导致的。
推荐写法(无异常、类型安全)
全程使用JObject原生的索引器访问,不要用dynamic类型做动态派发,从根源避免运行时绑定问题:
// 假设reportResults是你已经拿到的JObject对象 JToken customDataNode = reportResults["custom_data"]; if (customDataNode is JObject customData) { // 带空格的键直接作为字符串传入索引器即可,原生支持 string formName = customData["Form Name"]?.Value<string>(); string school = customData["School"]?.Value<string>(); }
也可以用链式简化写法,配合null条件运算符避免空引用:
string formName = reportResults["custom_data"]?["Form Name"]?.ToString();
异常原因说明
你之前的写法存在两个核心问题:
- 使用
dynamic声明变量后,运行时会尝试将返回的JToken对象按可枚举集合处理,自动调用First/Last等成员,但Form Name对应的节点是字符串类型的JValue,不是可遍历的JArray/JObject容器,自然会抛出InvalidOperationException。 - 动态绑定对包含空格、特殊字符的属性名的解析逻辑存在已知兼容问题,很容易出现绑定到错误运行时成员的情况。
不推荐的兼容写法
如果因为历史代码原因必须保留dynamic逻辑,需要显式做类型转换,禁止运行时自动推断类型:
dynamic dynamicResult = reportResults; string formName = (dynamicResult.custom_data as JToken)?["Form Name"]?.ToString();
额外注意
你提供的示例JSON在School字段后多了一个冗余尾逗号,直接调用JObject.Parse解析时会报错,实际使用时可以通过JsonLoadSettings配置兼容,或者提前清理JSON格式。
内容的提问来源于stack exchange,提问作者Vasanth R
相关产品推荐
相关产品推荐

