C#DataContract自定义反序列化

时间:2016-08-31 10:28:05

标签: c# json datacontract

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

从API返回的重要数据包含在JSON对象的“数据”键中,但这对我来说并不重要,我想丢弃它并将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#通常不是我使用的语言。

1 个答案:

答案 0 :(得分:0)

根据您的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);