【问题标题】:Creation of Model based on JSON response from API in C#在 C# 中基于来自 API 的 JSON 响应创建模型
【发布时间】:2021-04-01 21:12:44
【问题描述】:

我正在调用一个以 JSON 形式提供响应的 API。我正在尝试反序列化我很困惑的 JSON 对象以创建基于响应的模型。我的回复将如下所示:

代码:

IRestResponse res = client.Execute(request);
//res.content will be ginving me response as follows : 

以字符串格式回复:

"[{\"9305\":{\"headerData\":{\"poNum\":\"9305\",\"vendorId\":\"15963\",\"vendorName\":\"Enlow  Construction\",\"poValue\":\"20881.00\",\"currency\":\"USD\",\"utilValue\":\"10440.00\",\"dateCreated\":\"1/2/2020 5:44 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"abc.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"TQH - Painting - Site Improvement- 50% down required $10440.50\",\"rate\":\"\",\"amount\":\"20881.00\",\"quantity\":\"\"}]},\"9316\":{\"headerData\":{\"poNum\":\"9316\",\"vendorId\":\"14742\",\"vendorName\":\"Optum Health Financial Services\",\"poValue\":\"-723.75\",\"currency\":\"USD\",\"utilValue\":\"-723.75\",\"dateCreated\":\"1/2/2020 6:24 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"Ernesto.Sagun@C3connect.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"Employee Benefits\",\"rate\":\"\",\"amount\":\"-723.75\",\"quantity\":\"\"}]},\"9317\":{\"headerData\":{\"poNum\":\"9317\",\"vendorId\":\"9840\",\"vendorName\":\"Global Equipment Company\",\"poValue\":\"1194.34\",\"currency\":\"USD\",\"utilValue\":\"145.50\",\"dateCreated\":\"1/2/2020 6:30 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"Ernesto.Sagun@C3connect.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"Site Improvement Project - Budgeted Capex Spend - Thermostat Guards, Wheelchair and Compact Refrigerator\",\"rate\":\"\",\"amount\":\"1194.34\",\"quantity\":\"\"}]},\"9318\":{\"headerData\":{\"poNum\":\"9318\",\"vendorId\":\"9840\",\"vendorName\":\"Global Equipment Company\",\"poValue\":\"658.16\",\"currency\":\"USD\",\"utilValue\":\"539.70\",\"dateCreated\":\"1/2/2020 6:31 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"abc.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"Site Improvement Project - Budgeted Capex Spend - Thermostat Guards\",\"rate\":\"\",\"amount\":\"658.16\",\"quantity\":\"\"}]},\"9322\":{\"headerData\":{\"poNum\":\"9322\",\"vendorId\":\"13423\",\"vendorName\":\"Universal Protection Service, LP dba Allied Universal Security Services\",\"poValue\":\"57150.73\",\"currency\":\"USD\",\"utilValue\":\".00\",\"dateCreated\":\"1/2/2020 6:44 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"abc.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"US security guard services for Dec 2019\",\"rate\":\"\",\"amount\":\"57150.73\",\"quantity\":\"\"}]}}]"

当我尝试使用在线转换器创建模型时: https://json2csharp.com/json-to-csharp 我有以下课程:

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class HeaderData    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }

    public class Item    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }

    public class 9305    {
        public HeaderData headerData { get; set; } 
        public List<Item> items { get; set; } 
    }

    public class HeaderData2    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }

    public class Item2    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }

    public class 9316    {
        public HeaderData2 headerData { get; set; } 
        public List<Item2> items { get; set; } 
    }

    public class HeaderData3    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }

    public class Item3    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }

    public class 9317    {
        public HeaderData3 headerData { get; set; } 
        public List<Item3> items { get; set; } 
    }

    public class HeaderData4    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }

    public class Item4    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }

    public class 9318    {
        public HeaderData4 headerData { get; set; } 
        public List<Item4> items { get; set; } 
    }

    public class HeaderData5    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }

    public class Item5    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }

    public class 9322    {
        public HeaderData5 headerData { get; set; } 
        public List<Item5> items { get; set; } 
    }

    public class MyArray    {
        public 9305 9305 { get; set; } 
        public 9316 9316 { get; set; } 
        public 9317 9317 { get; set; } 
        public 9318 9318 { get; set; } 
        public 9322 9322 { get; set; } 
    }

    public class Root    {
        public List<MyArray> MyArray { get; set; } 
    }


但是所有类名 9305,9316,9317... 是如何动态的。如何轻松制作模型以使响应脱轨。

【问题讨论】:

    标签: c# asp.net-web-api .net-core


    【解决方案1】:

    首先,你应该重构生成的代码,

    public class HeaderData    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }
    
    public class Item    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }
    
    public class RootElement    {
        public HeaderData headerData { get; set; } 
        public List<Item> items { get; set; } 
    }
    

    使用Newtonsoft.Json 反序列化响应

    var jsonString= "[{\"9305\":{\"headerData\":{\"poNum\":\"9305\",\"vendorId\":\"15963\",\"vendorName\":\"Enlow  Construction\",\"poValue\":\"20881.00\",\"currency\":\"USD\",\"utilValue\":\"10440.00\",\"dateCreated\":\"1/2/2020 5:44 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"abc.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"TQH - Painting - Site Improvement- 50% down required $10440.50\",\"rate\":\"\",\"amount\":\"20881.00\",\"quantity\":\"\"}]},\"9316\":{\"headerData\":{\"poNum\":\"9316\",\"vendorId\":\"14742\",\"vendorName\":\"Optum Health Financial Services\",\"poValue\":\"-723.75\",\"currency\":\"USD\",\"utilValue\":\"-723.75\",\"dateCreated\":\"1/2/2020 6:24 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"Ernesto.Sagun@C3connect.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"Employee Benefits\",\"rate\":\"\",\"amount\":\"-723.75\",\"quantity\":\"\"}]},\"9317\":{\"headerData\":{\"poNum\":\"9317\",\"vendorId\":\"9840\",\"vendorName\":\"Global Equipment Company\",\"poValue\":\"1194.34\",\"currency\":\"USD\",\"utilValue\":\"145.50\",\"dateCreated\":\"1/2/2020 6:30 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"Ernesto.Sagun@C3connect.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"Site Improvement Project - Budgeted Capex Spend - Thermostat Guards, Wheelchair and Compact Refrigerator\",\"rate\":\"\",\"amount\":\"1194.34\",\"quantity\":\"\"}]},\"9318\":{\"headerData\":{\"poNum\":\"9318\",\"vendorId\":\"9840\",\"vendorName\":\"Global Equipment Company\",\"poValue\":\"658.16\",\"currency\":\"USD\",\"utilValue\":\"539.70\",\"dateCreated\":\"1/2/2020 6:31 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"abc.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"Site Improvement Project - Budgeted Capex Spend - Thermostat Guards\",\"rate\":\"\",\"amount\":\"658.16\",\"quantity\":\"\"}]},\"9322\":{\"headerData\":{\"poNum\":\"9322\",\"vendorId\":\"13423\",\"vendorName\":\"Universal Protection Service, LP dba Allied Universal Security Services\",\"poValue\":\"57150.73\",\"currency\":\"USD\",\"utilValue\":\".00\",\"dateCreated\":\"1/2/2020 6:44 am\",\"numInvoices\":\"1\",\"requestorName\":\"Sagun, Ernest\",\"requestorEmail\":\"abc.com\"},\"items\":[{\"item\":\"\",\"itemDesc\":\"US security guard services for Dec 2019\",\"rate\":\"\",\"amount\":\"57150.73\",\"quantity\":\"\"}]}}]";
    
    var elements = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string,RootElement>>>(jsonString).FirstOrDefault();
    

    然后,您可以直接获取属性。例如:

    elements["9305"].items.FirstOrDefault()?.amount
    

    【讨论】:

    • 能否根据您的代码提供模型如何定义?
    • 是的,做了同样的事情,但它抛出了一个异常,比如“转换...时出错”响应。
    • 面对此错误:“无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'C3ConnectLib.Item',因为该类型需要 JSON 对象(例如 {"name": "value"}) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化的类型更改为数组或实现集合接口的类型(例如 ICollection, IList),例如可以从 JSON 数组反序列化的 List。也可以将 JsonArrayAttribute 添加到类型以强制它从 JSON 数组反序列化。路径“[0].9305.items”,第 1 行,位置 294。”
    • 我认为您在更改之前测试了代码
    【解决方案2】:
    public class HeaderData    {
        public string poNum { get; set; } 
        public string vendorId { get; set; } 
        public string vendorName { get; set; } 
        public string poValue { get; set; } 
        public string currency { get; set; } 
        public string utilValue { get; set; } 
        public string dateCreated { get; set; } 
        public string numInvoices { get; set; } 
        public string requestorName { get; set; } 
        public string requestorEmail { get; set; } 
    }
    
    public class Item    {
        public string item { get; set; } 
        public string itemDesc { get; set; } 
        public string rate { get; set; } 
        public string amount { get; set; } 
        public string quantity { get; set; } 
    }
    
    public class YourModelName    {
        public HeaderData headerData { get; set; } 
        public List<Item> items { get; set; } 
    }
    public class Root    {
        public List<YourModelName> MyArray { get; set; } 
    }
    
     Root obj= JsonConvert.DeserializeObject<Root> (orderJson);
      List<YourModelName> array=obj.MyArray;
      HeaderData data=array[0].headerData;
      List<Item> items=array[0].items;
    

    这为您提供了数组中的第一项....希望您知道如何循环和获取 进一步的数据。

    【讨论】:

    • 如果这是模型,我们如何去反序列化?
    【解决方案3】:

    您可以通过以下方式使用 Newtonsoft.Json.Linq 中的 JObject: JObject json

    HeaderData headerData = jsonToHeaderData(json["9318"]["HeaderData"]);
    

    jsonToHeaderData 在哪里:

        protected HeaderData jsonToHeaderData(JToken json)
        {
            if (json != null && json.ToObject<object>() != null)
            {
                return json.ToObject<HeaderData>(JsonSerializer);
            }
            return null;
        }
    

    这样你就可以通过动态输入第一个数字和对HeaderData和Item建模来序列化所有的数据。

    我希望被证明是有帮助的。

    【讨论】:

      【解决方案4】:

      如果您只想测试 Json 响应,请尝试使用 Dynamic 关键字。它将存储您尝试从 API 获取的响应,而无需将它们存储在模型类中。适合测试和演示目的。

      https://www.geeksforgeeks.org/dynamic-type-in-c-sharp/

      【讨论】:

        猜你喜欢
        • 2012-11-06
        • 1970-01-01
        • 2021-02-13
        • 2021-10-17
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-09-15
        • 2019-02-09
        相关资源
        最近更新 更多