【问题标题】:c# Generic data object using newtonsofts JsonConvert DeserializeObjectc# 使用newtonsofts JsonConvert DeserializeObject的通用数据对象
【发布时间】:2019-06-21 06:34:45
【问题描述】:

我们正在使用一个外部 API,它使用对象名称“数据”返回其结果。这个“数据”可以表示两个不同的对象——一个是 json 对象数组的形式,另一个是单个 json 对象的形式。

我创建了两个单独的 c# 类,它们代表 JSON 对象数据和 ac# 根对象类,用于在使用 JsonConvert.DeserializeObject 进行转换时捕获 JSON 对象...如何在 C# 中正确表示这些对象,请参阅结果示例如下:

以下是 1 个结果 API 调用的示例

{
success:true,
Data:[{id:1,name:"Paul"},{id:2,name:"neville"},{id:3,name:"jason"}]
}

public class User
{
    public int id { get; set; }
    public string name { get; set; }
}

public class ApiResponse
{
    public bool success { get; set; }
    public List<User> Data { get; set; }
}

下面是生成的 API 调用示例 2

{
    success:true,
    Data:{id:1,classSize:30,minAge:25, maxAge:65}
}
public class AgeClass
{
    public int id { get; set; }
    public int classSize { get; set; }
    public int minAge { get; set; }
    public int maxAge { get; set; }
}

public class ApiResponse
{
    public bool success { get; set; }
    public AgeClass Data { get; set; }
}

我将如何构造 ApiResponse 类来满足返回的通用“数据”对象 json 字符串的需求 - 以便我可以使用通用的“JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync(), Settings);”

【问题讨论】:

标签: c# json json.net


【解决方案1】:

我建议考虑一下您实际上有 2 种 JSON 响应。 您也可以从基础 ApiResponse 类继承它们:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string json1 = @"{
                                ""success"":true,
                                ""Data"":[{id:1, name:""Paul""},{id:2,name:""neville""},{id:3,name:""jason""}]
                            }";

            string json2 = @"{
                                ""success"":true,
                                ""Data"":{id:1,classSize:30,minAge:25, maxAge:65}
                             }";

            string j = json1; //json2;

            JObject jo = JObject.Parse(j);

            ApiResponse parsed;

            if (jo["Data"].Type == JTokenType.Array)
                parsed = jo.ToObject<ApiUsersResponse>();
            else
                parsed = jo.ToObject<ApiAgeResponse>();

            Console.ReadKey();
        }        
    }

    class User
    {
        public int id { get; set; }
        public string name { get; set; }
    }

    class AgeClass
    {
        public int id { get; set; }
        public int classSize { get; set; }
        public int minAge { get; set; }
        public int maxAge { get; set; }
    }

    class ApiResponse
    {
        public bool success { get; set; }
    }

    class ApiUsersResponse : ApiResponse
    {
        public List<User> Data { get; set; }
    }

    class ApiAgeResponse : ApiResponse
    {            
        public AgeClass Data { get; set; }
    }     
}

【讨论】:

  • 谢谢 - 我已经使用上述方法来完成我所需要的
【解决方案2】:

您可以通过为Data 属性添加泛型类型参数来使您的类通用

public class ApiResponse<T>
{
    public bool success { get; set; }
    public T Data { get; set; }
}

然后在反序列化的时候使用:

  var result = JsonConvert.DeserializeObject<ApiResponse<AgeClass>>(myJson ...);
  var result = JsonConvert.DeserializeObject<ApiResponse<List<User>>>(myJson ...);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多