我在将 JSON 对象反序列化到我的类中时遇到问题。
我有一个类
DocumentListByPolicy
,在另一个类中用作List<>
。对于文档列表,这是我的代码:
namespace MyNameSpace
{
[DataContract]
public class DocumentListByPolicy
{
[DataMember(Name = "documentCreatedDate")]
public DateTime DocumentCreatedDate { get; set; }
[DataMember(Name = "comment")]
public string VehicleVinNumber { get; set; }
// ..... more properties here
}
}
我想做的是将“comment”属性引用为
VehicleVinNumber
,这是我在 LINQ 语句中所做的:
DocIDsByVIN = resp.LevelDocumentList.GroupBy(d => d.VehicleVinNumber.Trim())
.Select(l => l.OrderByDescending(d => d.DocumentCreatedDate).FirstOrDefault(d => d.DocumentId > 0))
.Where(r => r != null)
.ToDictionary(r => r.VehicleVinNumber.Trim(), r => r.DocumentId);
它编译并运行,但在 LINQ 代码中抛出错误,因为它表示
VehicleVinNumber
为空。如果我将模型中的名称更改回“comment”或“Comment”,代码将按预期工作。我对 DataMember
属性的印象是能够将返回的值映射回我的模型属性名称,但这似乎并没有发生。映射未发生。
任何人都可以告诉我我做错了什么吗?
谢谢
反序列化由 RestSharp 扩展方法完成。
public static partial class RestClientExtensions {
[PublicAPI]
public static RestResponse<T> Deserialize<T>(this IRestClient client, RestResponse response)
=> client.Serializers.Deserialize<T>(response.Request!, response, client.Options);
问题源于 RestSharp 及其序列化器如何处理 JSON 反序列化。具体来说,RestSharp 的 JSON 序列化程序默认不尊重 DataMember 属性。
为什么 DataMember 不工作? [DataMember] 属性通常与遵循 DataContract 模型的序列化程序一起使用,例如 DataContractJsonSerializer。但是,RestSharp 默认情况下使用 System.Text.Json 或 Newtonsoft.Json 进行序列化/反序列化,除非显式配置,否则它们不会自动尊重 DataMember 属性。
解决方案:使用 JSON 特定的属性 要解决此问题,您可以根据您使用的序列化程序从 [DataMember] 切换到 JSON 特定的属性:
对于 System.Text.Json(.NET 5+ 中的默认值): 使用 [JsonPropertyName] 属性:
[JsonPropertyName("comment")]
public string VehicleVinNumber { get; set; }
对于 Newtonsoft.Json(在遗留项目中常见): 使用 [JsonProperty] 属性:
[JsonProperty("comment")]
public string VehicleVinNumber { get; set; }