【问题标题】:Deserialize JSON object list to C# Class List将 JSON 对象列表反序列化为 C# 类列表
【发布时间】:2022-12-13 01:46:12
【问题描述】:

我有一个由 Python/Flask 制作的 API。我想从该 API 获取数据以在 C# 中使用。我尝试了很多东西,但我没有弄清楚。

以下是来自 API 的一些数据

我写了类来匹配这些数据。

然后我编写了应该用于处理数据的代码。

最后,我从 API 获得了 JSON 格式的响应(没问题)。但是反序列化操作不起作用。 “数据”变量变成了数组,但我看不到/访问来自 Json 的值。

请帮助我,如何反序列化来自 API 的数据。尽管我尝试从互联网上找到很多代码进行反序列化,但我无法处理它。

【问题讨论】:

    标签: c# .net api blazor deserialization


    【解决方案1】:

    这并不是您问题的直接答案,但您是否考虑过只使用 dynamic 类型?我发现按预期使用 JSON 更容易,弱类型......

    dynamic data = Json.Decode(response);
    
    foreach (dynamic warehouse in data)
    {
        int companyId = warehouse.company_id;
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:var warehouse = Warehouse.FromJson(jsonString);。基本上设置部分:JsonConvert.DeserializeObject<List<Warehouse>>(json, Warehouse.Converter.Settings); 就足够了。您可以使用转换器的最低设置。

      using System;
      using System.Collections.Generic;
      using System.Globalization;
      using Newtonsoft.Json;
      using Newtonsoft.Json.Converters;
      
      namespace Warehouse
      {
          public partial class Warehouse
          {
              [JsonProperty("company_id")]
              public long CompanyId { get; set; }
      
              [JsonProperty("id")]
              public long Id { get; set; }
      
              [JsonProperty("name")]
              public string Name { get; set; }
      
              public static List<Warehouse> FromJson(string json) => JsonConvert.DeserializeObject<List<Warehouse>>(json, Warehouse.Converter.Settings);
      
          }
      
      
          public static class Serialize
          {
              public static string ToJson(this List<Warehouse> self) => JsonConvert.SerializeObject(self, Warehouse.Converter.Settings);
          }
      
          internal static class Converter
          {
              public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
              {
                  MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
                  DateParseHandling = DateParseHandling.None,
                  Converters =
                  {
                      new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
                  },
              };
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-30
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        相关资源
        最近更新 更多