提问者:小点点

如何反序列化不同类型的派生类?


我试图反序列化2种不同类型的列表,包括它们的派生类

为了更好地解释它,我做了下面的例子

我有2个系统:
API系统

  public class ItemController : ControllerBase
    {
        private readonly ILogger<ItemController> _logger;

        public ItemController(ILogger<ItemController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public async Task<ActionResult<BaseItem>> Get()
        {
            var items = new List<BaseItem>();
            items.Add(new BaseItem { Id = 1 });
            items.Add(new Item { Id = 2, ItemName = "some name", ItemType = "some type" });

            return Ok(items);
        }
    }

与下列实体合作:

namespace SomeService.API.Entities
{
    public class BaseItem
    {
        public int Id { get; set; }
    }
    public class Item: BaseItem
    {
        public string ItemType { get; set; }
        public string ItemName { get; set; }
    }
}

应用系统

static async Task Main(string[] args)
        {
            var client = new HttpClient();
            var response = await client.GetAsync($"http://localhost:5000/Item");
            Thread.Sleep(3000);
            var dataAsString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            JsonSerializerSettings settings = new JsonSerializerSettings();
            var obj = JsonConvert.DeserializeObject<List<BaseItem>>(dataAsString);

        }  

使用以下DTO

namespace SomeSystem.APP.DTOs
{
    public class BaseItem
    {
        public int Id { get; set; }
    }
    public class Item : BaseItem
    {
        public string ItemType { get; set; }
        public string ItemName { get; set; }
    }
}

使用此示例,API系统返回一个列表

将应用程序DTO反序列化到列表后,反序列化时出现问题

1我想的解决方法是创建一个类库并将所有实体移动到那里,然后将两个系统引用到这个类库,因此我将在两个系统中拥有相同类型的实体,但是,我不想使用这个工作,因为我不希望这两个系统之间的第三方依赖关系,我希望它们完全独立。所以我的问题是,
有没有其他工作可以让我在应用环境中以我能够使用的方式反序列化json派生类属性?


共1个答案

匿名用户

你应该处理这个项目。我认为您的混淆使用的是var,因为您假设的是匿名或变体类型,但不是。根据具体情况,您不会返回一个或另一个。

你写道:

 var items = new List<BaseItem>();
            items.Add(new BaseItem { Id = 1 });
            items.Add(new Item { Id = 2, ItemName = "some name", ItemType = "some type" });

但在编译中,这段代码实际上意味着:

 List<Item>  items = new List<Item>();
            items.Add(new Item { Id = 1, ItemName = null, ItemType = null});
            items.Add(new Item { Id = 2, ItemName = "some name", ItemType = "some type" });

作为架构建议,您不应该混合类来响应相同的服务,或者您应该使用您将返回的真实。

如果您想要的是变体类型(我不建议),您应该阅读@Eric comment的问题。但是动态对象不是var

相关问题