You need to enable JavaScript to run this app. C#使用Newtonsoft.Json解析时无法读取operator字段AND/OR值的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 13:24:07