是否可以将 JSON 反序列化为 C# 中的泛型对象并让属性名称是动态的?

问题描述 投票:0回答:1
我很乐意使用 NewtonSoft 或 System.Text.Json 反序列化器。 我会收到来自 API 的许多不同响应,并且不希望为每个响应编写单独的响应对象。

例如,每个响应都有一个消息属性和一个状态码属性,那么它就是实际数据。

所以,我想要的是

public class ApiResponse<T> { public string StatusCode{ get; set; } public string Message{ get; set; } public ICollection<T> Data { get; set; } }
问题是,虽然我可以正确设置“T”,但我无法将反序列化映射到它,因为它期望属性是“用户”或“购买”等,而不是“数据”。

我知道我可以设置 JsonProperty[] 装饰器,但问题是这对于 T 来说不是动态的。

如果有

技术上的方法,但它并不比为每个对象创建单独的响应对象更干净,我很乐意继续编写单独的对象;但对我还没有找到的更好的解决方案(如果存在)感兴趣。

c# json json.net
1个回答
0
投票
每当你遇到这样的事情,有点偏离常规时,一般的解决方案是编写一个

JsonConverter

 实现来自己处理它。是的,您可以使用包装类等完成各种棘手的事情。我自己做了很多这样的事......但它不是很通用。

如何编写用于 JSON 序列化的自定义转换器”中概述了基本概念。在两种模式(基本模式和工厂模式)中,工厂模式可让您处理泛型类型。

定义工厂类型后,您可以使用

JsonConverter

 属性向 json 序列化器/反序列化器发出信号,表明您希望将此特定转换器(或本例中的工厂)与您的类型一起使用:

public class ApiResponseConverterFactory : JsonConverterFactory { // refer to the fiddle for details } [JsonConverter(typeof(ApiResponseConverterFactory))] public class ApiResponse<T> { public string StatusCode { get; set; } = string.Empty; public string Message { get; set; } = string.Empty; public T? Data { get; set; } // This is just a convenience in case you want to re-serialize. [JsonIgnore] public string? DataPropName { get; set; } }
至于实际代码...

这是一个小提琴。我已经组装了一个简单的转换器工厂,它可以完成...基础知识。

© www.soinside.com 2019 - 2024. All rights reserved.