【发布时间】:2022-01-26 06:48:16
【问题描述】:
API 重新调整 json 对象,如下 2 种形式。
表格 1
{
"Pricing": [
{
"total": 27,
"currency": "USD",
"charges": [ //Chargers Array
{
"code": "C1",
"currency": "USD",
"rate": 15
},
{
"code": "C45",
"currency": "USD",
"rate": 12
}
]
}
]
}
表格 2
{
"Pricing": [
{
"total": 12,
"currency": "USD",
"charges": { //Chargers single object
"code": "C1",
"currency": "USD",
"rate": 12
}
}
]
}
正如您所见,充电器对象有时会返回数组,有时则不会。我的问题是如何将其解析为 C# 类对象?如果我添加了如下所示的 C# 类,则无法正确解析 Form 2。(正确解析 Form 1)
public class Charge
{
public string code { get; set; }
public string currency { get; set; }
public decimal rate { get; set; }
}
public class Pricing
{
public decimal total { get; set; }
public string currency { get; set; }
public List<Charge> charges { get; set; } //In Form 2, this should be single object
}
public class MainObj
{
public List<Pricing> Pricing { get; set; }
}
使用 Newtonsoft 反序列化解析时发生错误。
MainObj obj = JsonConvert.DeserializeObject<MainObj>(json);
错误
无法反序列化当前 JSON 对象(例如 {"name":"value"}) 进入类型 'System.Collections.Generic.List`1[Charge]' 因为类型 需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。修理 此错误将 JSON 更改为 JSON 数组(例如 [1,2,3])或 更改反序列化类型,使其成为普通的 .NET 类型(例如 不是像整数这样的原始类型,不是像数组这样的集合类型 或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。路径“定价 [0].charges.code”,行 1,位置 69。
在用C#接收不同类型的对象类型时,有什么常用的解析方法吗?
(我也研究了this,但它是针对java的。大多数此类问题是针对java而不是C#提出的。)
【问题讨论】:
-
为每个表单创建两个类
-
这行不通@Fabio,因为我的完整 json 对象具有更多属性,例如“充电器”。
-
与 API 提供商交谈以始终发送数组,这将简化这两项工作:)
-
或者为定价类编写自己的序列化程序来处理这两种情况。
-
API 提供的公司与我们相比是如此之大,他们将花费大量时间来实施它。 :(