【发布时间】: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<string, object> empdata { get; set; } = new Dictionary<string, object>();,然后根据值是string还是int,自行将其映射到对象中