将不同的json文档反序列化为相同的对象结构

时间:2017-08-16 06:38:27

标签: c# json asp.net-web-api json.net deserialization

我正在寻找这种方案的最佳方法:

我想创建WebApi,它会向客户端返回一些对象,如:

{
   id: 1,
   name: "name1",
   type: "type1"
}

我可以从不同的数据提供者(文档dbs)中检索这些数据,这些数据提供者可以具有不同的数据结构,如:

第一来源:

{
   id: 1,
   name: "name1",
   type: "type1"
}

第二个来源:

{
   productId: 1,
   productName: "product",
   productType: "type"
}

第三来源:

{
   itemId: 1,
   itemName: "name",
   itemType: "type"
}

哪种方法可以让下一代数据提供商轻松扩展?我想补充一点,我一如既往地考虑JSON.NET lib。所以我相信我正在寻找依赖数据提供者的不同json映射的例子?有人可以帮一些例子吗?我还要补充一点,它只是'只读'场景,所以我的意思是WebApi调用不同的dbs =>反序列化为某个对象=>最终操纵对象本身=>通过http发送。

3 个答案:

答案 0 :(得分:0)

Automapper和三种不同的dtos将是最正确的方式imo。但是如果你想以一种非常简单的方式来创建一个具有所有不同属性的单个类,并且相应的属性使用相同的后备变量

class Item
{
    string _id;

    public string id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
        }
    }
    public string productId
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
        }
    }
    public string itemId
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
        }
    }

    string _name;

    public string name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
    public string productName
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
    public string itemName
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    string _type;

    public string type
    {
        get
        {
            return _type;
        }
        set
        {
            _type = value;
        }
    }
    public string productType
    {
        get
        {
            return _type;
        }
        set
        {
            _type = value;
        }
    }
    public string itemType
    {
        get
        {
            return _type;
        }
        set
        {
            _type = value;
        }
    }
}

答案 1 :(得分:0)

另一种可能的方法是将serialization settings与自定义contract resolver对象一起使用,该对象会覆盖ResolvePropertyName方法。

答案 2 :(得分:0)

您可以使用AutoMapper解决此问题。

http://automapper.org/

https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

试试下面的示例

    public class ReturnObject
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }
    }
    public class Source1
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }
    }
    public class Source2
    {
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public string ProductType { get; set; }
    }
    public class Source3
    {
        public int ItemId { get; set; }
        public string ItemName { get; set; }
        public string ItemType { get; set; }
    }

AutoMapper个人资料

public class AutoMapperProfile : Profile
{
    public AutoMapperProfile()
    {
        //Same properties
        CreateMap<Source1, ReturnObject>();

        //Difference properties
        CreateMap<Source2, ReturnObject>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(f => f.ProductId))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(f => f.ProductName))
            .ForMember(dest => dest.Type, opt => opt.MapFrom(f => f.ProductType));
        CreateMap<Source3, ReturnObject>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(f => f.ItemId))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(f => f.ItemName))
            .ForMember(dest => dest.Type, opt => opt.MapFrom(f => f.ItemType));
    }
}