c#数据契约自定义反序列化

本文关键字:反序列化 自定义 契约 数据 | 更新日期: 2023-09-27 18:04:49

我需要数据合约问题的帮助。我有一个web服务,输出JSON,需要映射到一个c#对象。

从API返回的重要数据包装在JSON对象的"data"键中,但这对我来说并不重要,我想放弃它,并将JSON反序列化到Item类中。 Item类在其他地方使用,如果可能的话,我真的希望保持它不变

是否有一种方法可以改变JSON中的数据如何被反序列化到Item对象中,但将Item对象序列化为默认值?

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

如果不可能保持Item类不变,那么你能建议最简单的修改来实现目标吗?

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#通常不是我使用的语言。

c#数据契约自定义反序列化

根据你的json,你的数据是在一个类的格式,像这样

 [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; }
    }

您的响应是包装器的格式,其中data是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);