【问题标题】:Multiple employees Json gives Deserializing error多名员工 Json 给出反序列化错误
【发布时间】:2021-07-06 04:16:00
【问题描述】:

我正在使用 C# 中的 Httpclient 阅读 2 个 REST API。 API 以 JSON 格式返回以下员工数据:

第一个 API

{
    "status": "OK", 
    "content": {
        "empid1": 89900,
        "empid2": 45550,
        "empid3": 22350}
}

第二个 API

 {
    "status": "OK", 
     "content": {
              "empid1": "grade1",
              "empid1": "grade2",
              "empid1": "grade2"}}

定义的类和使用的代码如下:

 public class content
    {
        public string empid { get; set; } // e.g. empid3
        public double salary { get; set; } // e.g. 89900
        public string grade { get; set; } // e.g. Grade1
    }
    public sealed class WrapperEmployees
    {
        [JsonProperty("status")]
        public string Status { get; set; }

        [JsonProperty("data")]
        public List<content> empdata { get; set; } = new List<data>();
    }

要反序列化,使用这个-

WrapperEmployees nj = JsonConvert.DeserializeObject<WrapperEmployees>(response);

但是,最后一行在反序列化时出错:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[CsharpSample.App_Code.Employee]”,因为该类型需要 JSON 数组(例如 [ 1,2,3]) 正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。路径“content.emp1”,第 4 行,位置 18。

我的班级结构不正确吗? 我的最终目标是从两个 API 中获取针对员工的通用数据。

【问题讨论】:

  • 您有重复的密钥"empid1"。虽然 JSON 技术上 不禁止这样做,但您绝对应该 做这样的事情,除非您绝对 必须这样做。与负责此 API 的人员交谈,让他们将代码修复得不那么糟糕。
  • 不相关:public double salary { get; set; } // e.g. 89900 - 不要使用浮点数表示货币金额。
  • 并且json属性被命名为“内容”,而不是“数据”。
  • into type 'System.Collections.Generic.List`1[CsharpSample.App_Code.Employee]' 提示您没有发布创建异常的代码。
  • 尝试public Dictionary&lt;string, object&gt; empdata { get; set; } = new Dictionary&lt;string, object&gt;();,然后根据值是string 还是int,自行将其映射到对象中

标签: c# json.net webapi


【解决方案1】:

选项 1:对每个 json 反序列化使用特定的类:

class EmployeesSalaries {
  public string Status { get; set; }
  public Dictionary<string, int> content { get; set; };
}
class EmployeesGrades {
  public string Status { get; set; }
  public Dictionary<string, string> content { get; set; };
}

选项 2:反序列化为普通类,但只有当它们是 int/string 时,您才会获得“好”content 值。如果它们是对象 - 您将拥有 JObjects 作为值。

class EmployeesData {
  public string Status { get; set; }
  public Dictionary<string, object> content { get; set; };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多