C# DataContract 自定义反序列化

C# DataContract custom deserialisation

我需要有关 DataContract 问题的帮助。我有一个输出 JSON 需要映射到 C# 对象的 Web 服务。

从 API 返回的重要数据包装在 JSON 对象的 "data" 键中,但这对我来说并不重要,我想丢弃它并拥有JSON 反序列化为项目 class。 项目class在其他地方使用,如果可能我真的很想保持不变

有没有办法更改 JSON 中的数据反序列化到 Item 对象的方式,但保留 Item 对象序列化为默认值?

当前代码正在执行 var item = await response.Content.ReadAsAsync<Item>(); 从 API 响应构建对象。

如果无法保持项目 class 不变,那么您能否建议最简单的修改来实现目标。

JSON:

{
  "data": {
    "id": "13c38fe9-6d9f-4a11-8eda-d071f2a99698",
    "item_type": 100,
    "item_name": "My Item Name"
  }
}

C# 对象:

[DataContract]
public class Item
{
    [DataMember(Name = "id")]
    public Guid Id { get; set; }

    [DataMember(Name = "item_type")]
    public int? ItemType { get; set; }

    [DataMember(Name = "item_name")]
    public string ItemName { get; set; }
}

任何帮助将不胜感激,因为 C# 通常不是我使用的语言。

根据您的 json,您的数据采用 class 格式,如下所示

 [DataContract]
    public class Wrapper
    {
        [DataMember(Name = "data")]
        public Item item { get; set; }
    }
    [DataContract]
    public class Item
    {
        [DataMember(Name = "id")]
        public Guid Id { get; set; }

        [DataMember(Name = "item_type")]
        public int? ItemType { get; set; }

        [DataMember(Name = "item_name")]
        public string ItemName { get; set; }
    }

您的响应采用包装器格式,其中数据是 属性 类型的 Item。为您的合同添加一个包装器,它应该可以正常工作。

您可以运行这样,以检查您的序列化字符串是否采用相同格式。

Wrapper tempData = new Wrapper() { item = new Item() {
                                                    Id = new Guid("13c38fe9-6d9f-4a11-8eda-d071f2a99698"),
                                                    ItemName = "My Item Name",
                                                    ItemType = 100 } };
    var serializedDta = JsonConvert.SerializeObject(tempData);