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
相关产品推荐
相关产品推荐

