You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON反序列化为自定义C#类型失败及忽略attributes字段求助

JSON反序列化失败问题排查与解决

给定的JSON数组

[    
    {        
        "attributes": {            
            "type": "M2O_ProductOptions__c",            
            "url": ""        
        },        
        "Id": "aAP8A0000004ZkiWAE",        
        "ExternalId__c": "123456_ABCDEFG",        
        "Product__r": {            
            "attributes": {                
                "type": "Product2",                
                "url": "/services/data/v51.0/sobjects/Product2"            
            },            
            "ProductCode": "123456"        
        },        
        "Option__r": {            
            "attributes": {                
                "type": "Product2",                
                "url": "/services/data/v51.0/sobjects/"            
            },            
            "ProductCode": "23456"        
        }    
    }
]

定义的C#类

public class SF_M20_ProductOptions{    
    public string Id { get; set; }    
    public string ExternalId__c { get; set; }    
    public Product__r Product__r { get; set; }    
    public Option__r Option__r { get; set; }
}

public class Product__r{    
    public string ProductCode { get; set; }
}

public class Option__r{    
    public string ProductCode { get; set; }
}

反序列化错误信息

Unable to convert type string to SF_M20_ProductOptions

注意事项

JSON中的"attributes":{}元素不属于SF_M20_ProductOptions类型,反序列化时需要忽略该字段。

当前反序列化代码

List<SF_M20_ProductOptions> obj = JsonConvert.DeserializeObject<List<SF_M20_ProductOptions>>(doc);

其中doc的toString()值为:

"\"[{\\\"attributes\\\":{\\\"type\\\":\\\"M2O_ProductOptions__c\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/M2O_ProductOptions__c/aAP8A0000004ZkiWAE\\\"},\\\"Id\\\":\\\"aAP8A0000004ZkiWAE\\\",\\\"ExternalId__c\\\":\\\"722137_NCVB641\\\",\\\"Product__r\\\":{\\\"attributes\\\":{\\\"type\\\":\\\"Product2\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/Product2/01t8A000005vdmtQAA\\\"},\\\"ProductCode\\\":\\\"722137\\\"},\\\"Option__r\\\":{\\\"attributes\\\":{\\\"type\\\":\\\"Product2\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/Product2/01t8A000004f9FtQAI\\\"},\\\"ProductCode\\\":\\\"NCVB641\\\"}}]\""

解决方案

1. 修复doc的字符串转义问题

从doc的输出可以看到,字符串被双重转义(外层多了引号和转义符),需要先处理得到合法的JSON字符串:

// 去除外层包裹的双引号
string cleanedDoc = doc.ToString().Trim('"');
// 反转义字符串,还原成标准JSON格式
string validJson = System.Text.RegularExpressions.Regex.Unescape(cleanedDoc);

2. 配置Json.NET忽略未定义字段

要忽略JSON中存在但C#类未声明的attributes字段,有两种实现方式:

方式一:序列化时添加配置

修改反序列化代码,传入带忽略配置的JsonSerializerSettings:

var settings = new JsonSerializerSettings
{
    MissingMemberHandling = MissingMemberHandling.Ignore
};
List<SF_M20_ProductOptions> obj = JsonConvert.DeserializeObject<List<SF_M20_ProductOptions>>(validJson, settings);

方式二:给类添加特性标记

在C#类上添加特性,全局忽略未定义字段:

[JsonObject(MissingMemberHandling = MissingMemberHandling.Ignore)]
public class SF_M20_ProductOptions{    
    public string Id { get; set; }    
    public string ExternalId__c { get; set; }    
    public Product__r Product__r { get; set; }    
    public Option__r Option__r { get; set; }
}

[JsonObject(MissingMemberHandling = MissingMemberHandling.Ignore)]
public class Product__r{    
    public string ProductCode { get; set; }
}

[JsonObject(MissingMemberHandling = MissingMemberHandling.Ignore)]
public class Option__r{    
    public string ProductCode { get; set; }
}

完整可运行代码示例

// 处理转义问题
string cleanedDoc = doc.ToString().Trim('"');
string validJson = System.Text.RegularExpressions.Regex.Unescape(cleanedDoc);

// 配置序列化设置
var settings = new JsonSerializerSettings
{
    MissingMemberHandling = MissingMemberHandling.Ignore
};

// 执行反序列化
List<SF_M20_ProductOptions> obj = JsonConvert.DeserializeObject<List<SF_M20_ProductOptions>>(validJson, settings);

内容的提问来源于stack exchange,提问作者Bala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:29