反序列化 JSON 对象时忽略 DataMember Name 属性

问题描述 投票:0回答:1

我在将 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);
c# restsharp json-deserialization .net-4.8
1个回答
1
投票

问题源于 RestSharp 及其序列化器如何处理 JSON 反序列化。具体来说,RestSharp 的 JSON 序列化程序默认不尊重 DataMember 属性。

为什么 DataMember 不工作? [DataMember] 属性通常与遵循 DataContract 模型的序列化程序一起使用,例如 DataContractJsonSerializer。但是,RestSharp 默认情况下使用 System.Text.Json 或 Newtonsoft.Json 进行序列化/反序列化,除非显式配置,否则它们不会自动尊重 DataMember 属性。

解决方案:使用 JSON 特定的属性 要解决此问题,您可以根据您使用的序列化程序从 [DataMember] 切换到 JSON 特定的属性:

  1. 对于 System.Text.Json(.NET 5+ 中的默认值): 使用 [JsonPropertyName] 属性:

    [JsonPropertyName("comment")]
    public string VehicleVinNumber { get; set; }
    
  2. 对于 Newtonsoft.Json(在遗留项目中常见): 使用 [JsonProperty] 属性:

    [JsonProperty("comment")]
    public string VehicleVinNumber { get; set; }
    
© www.soinside.com 2019 - 2024. All rights reserved.