C#使用Newtonsoft.Json解析时无法读取operator字段AND/OR值的问题咨询
问题根因
取值始终为空的核心原因是反序列化时的字段映射不匹配:
operator是C#保留关键字,Visual Studio在自动从JSON生成实体类时,为了规避语法冲突,会自动将对应属性名添加下划线前缀,生成_operator- Newtonsoft.Json默认按照“属性名与JSON键名完全一致”的规则做映射,不会主动将类中的
_operator属性与JSON报文里的operator键关联 - 由于其他JSON键对应的名称都不是C#保留字,VS生成类时的属性名和JSON键完全一致,因此其他字段都能正常完成映射读取,仅operator字段因为命名规则变更导致匹配失效,始终无法被填充值。
两种可稳定运行的修复方案
方案1:最小改动的显式映射
仅需给现有_operator属性添加JsonProperty特性,显式声明该属性对应的JSON键名,不需要修改原有的业务取值逻辑,改动成本最低:
public class Node { // 显式绑定JSON中的operator字段到当前属性 [JsonProperty("operator")] public string _operator { get; set; } public Cpe_Match[] cpe_match { get; set; } public Child[] children { get; set; } }
修改完成后,原有代码中读取num.configurations.nodes[0]._operator的逻辑无需任何调整,即可正常获取AND/OR的字符串值。
方案2:符合C#命名规范的原生写法
C#支持通过@前缀将保留字作为合法标识符使用,你可以去掉属性名的下划线前缀,让属性名与JSON键完全一致,无需额外添加序列化特性:
public class Node { // 用@前缀转义保留字,与JSON的operator键完全匹配 public string @operator { get; set; } public Cpe_Match[] cpe_match { get; set; } public Child[] children { get; set; } }
这种写法需要同步调整原有取值代码,将原来读取_operator的位置替换为读取@operator即可,示例:
Console.WriteLine("AndOr : " + num.configurations.nodes[0].@operator);
验证说明
修改完成后重新发起NVD接口请求,控制台输出的AndOr字段会正常展示对应节点的AND/OR配置值,后续即可基于该值做分支判断,适配不同逻辑下的CPE节点解析。两种方案仅修正Node类的operator属性映射逻辑,不会影响其他字段的正常读取。
内容的提问来源于stack exchange,提问作者provell
相关产品推荐
相关产品推荐

