如何对JSON对象进行多态反序列化?

How To Deserialize a JSON Object Polymorphicly?

提问人:David Hill 提问时间:10/25/2023 最后编辑:David Hill 更新时间:10/25/2023 访问量:67

问:

我正在尝试以 JSON 格式从 API 反序列化数据。我通过四种不同的查询来获取数据。它们如下所示:GetDatasetlist、GetParameterList、GetParameterValues 和 GetData。每个查询都返回一个格式相似的 JSON 格式字符串。格式如下:

API : {

        Request :
        {
              RequestParam :
               [{...}, {...}, {...}]
        },

        Results :
        {
            [Dataset],[Parameter],[ParamValue],[Data]
        }
}

JSON 字符串的变量部分位于结果下,根据我正在执行的查询,我将获得 Dataset、Parameter、ParamValue 或 Data 之一。虽然我可以完全独立地处理每个案例并解决问题,但考虑到很多代码重叠,这似乎是不正确的决定。

所有四个潜在的返回对象在结构上都与另一个不同,但我想知道是否还有一种方法可以使用多态性来处理它们。

我创建的用于反序列化 JSON 代码的类如下:

        public class QueryResults
        {
            public _API API { get; set; }
            public List<_RequestParam> RequestParams { get { return API.Request.RequestParam; } }
        }
        public class _API
        {
            public _Request Request { get; set; }
            public _Results Results { get; set; }

        }
        public class _Request
        {
            public List<_RequestParam> RequestParam { get; set; }
        }
        public class _RequestParam
        {
            public string ParameterName { get; set; }
            public string ParameterValue { get; set; }
        }
        public class _Results
        {
             ???
        }

我已经尝试使用可为 null 的类型,但我使用的是 C# 7.3,这不允许这样做。

任何帮助都是值得赞赏的。谢谢!

C# JSON json.net

评论

2赞 Heretic Monkey 10/25/2023
似乎你可以让你的类是泛型的,泛型部分是属性的类型。然后,您需要做的就是为请求的 API 提供正确的泛型类型。APIResults
0赞 Charlieface 10/25/2023
如何区分不同的对象类型?
0赞 Power Mouse 11/7/2023
您需要阅读有关歧视工会的信息 OneOf<....>,我为您找到了详细示例: code-maze.com/csharp-discriminated-unions-with-one

答: 暂无答案