使用C#反序列化Dynamics 365 CRM API JSON返回null问题排查
解决Dynamics 365 CRM JSON反序列化返回null的问题
从你的代码和描述来看,反序列化返回null最可能的原因是C#类的属性名和Dynamics 365 API返回的JSON字段名不匹配,加上缺少必要的反序列化配置,导致Newtonsoft.Json无法正确解析JSON结构。下面是具体的解决步骤:
1. 修正类的属性映射(核心问题)
Dynamics 365返回的JSON有特定的字段命名规则,比如上下文字段是@odata.context,数据数组是value,而你的类里用了odata_context和keyValues,两者完全不匹配,这会导致反序列化器找不到对应的数据,最终返回null。
你需要给类的属性添加[JsonProperty]特性,明确映射JSON中的字段名。修正后的类如下:
using Newtonsoft.Json; using System; using System.Collections.Generic; public class Values { [JsonProperty("@odata.context")] public string OdataContext { get; set; } [JsonProperty("value")] public List<ContactsDeserialize> KeyValues { get; set; } } public class ContactsDeserialize : IDisposable { [JsonProperty("@odata.etag")] public string OdataEtag { get; set; } [JsonProperty("contactid")] public Guid ContactId { get; set; } [JsonProperty("crimson_title")] public string CrimsonTitle { get; set; } [JsonProperty("firstname")] public string FirstName { get; set; } [JsonProperty("lastname")] public string LastName { get; set; } [JsonProperty("createdon")] public DateTime? CreatedOn { get; set; } [JsonProperty("birthdate")] public DateTime? BirthDate { get; set; } [JsonProperty("emailaddress1")] public string EmailAddress1 { get; set; } [JsonProperty("mobilephone")] public string MobilePhone { get; set; } [JsonProperty("address1_line1")] public string Address1Line1 { get; set; } [JsonProperty("address1_line2")] public string Address1Line2 { get; set; } [JsonProperty("address1_line3")] public string Address1Line3 { get; set; } [JsonProperty("address1_city")] public string Address1City { get; set; } [JsonProperty("address1_postalcode")] public string Address1PostalCode { get; set; } [JsonProperty("address1_telephone1")] public string Address1Telephone1 { get; set; } public void Dispose() { // 这里实现你的IDisposable逻辑,如果不需要可以留空或移除接口(如果没实际释放逻辑的话) } }
2. 调整反序列化配置
Dynamics 365返回的JSON通常包含很多你未定义的额外字段,如果不配置忽略这些未知字段,反序列化器可能会抛出错误,最终返回null。你需要添加序列化设置来避免这种情况:
var serializerSettings = new JsonSerializerSettings { // 忽略JSON中存在但类中未定义的属性 MissingMemberHandling = MissingMemberHandling.Ignore, // 忽略null值(可选,根据你的需求调整) NullValueHandling = NullValueHandling.Ignore }; Values ContactData = JsonConvert.DeserializeObject<Values>(jsonstring, serializerSettings);
3. 验证JSON字符串的有效性
如果上述调整后还是返回null,建议先验证你的jsonstring是否是有效的JSON格式,并且符合Dynamics 365 Contacts API返回的结构(比如包含@odata.context和value数组)。你可以用JSON格式化工具检查字符串是否有语法错误。
内容的提问来源于stack exchange,提问作者sansalk
相关产品推荐
相关产品推荐

