C#反序列化太阳辐射API分散属性JSON的模型构建问题
太阳辐射API JSON反序列化实体模型构建方案
实体类设计逻辑
- 同名但分属不同层级、结构不同的节点必须定义独立类,quicktype的拆分方案是合理的,Json2csharp的自动合并逻辑不符合该JSON的结构特征
- 根节点下的
inputs/outputs/location为业务数据类,meta节点下的同名为元数据类,二者独立定义互不干扰
完整实体类示例(C#)
using Newtonsoft.Json; // 若使用System.Text.Json替换为using System.Text.Json.Serialization; // 根响应对象 public class SolarRadiationRoot { /// <summary> /// 根节点下的业务入参数据 /// </summary> [JsonProperty("inputs")] // System.Text.Json用[JsonPropertyName("inputs")] public BusinessInput Inputs { get; set; } /// <summary> /// 根节点下的业务返回数据 /// </summary> [JsonProperty("outputs")] public BusinessOutput Outputs { get; set; } /// <summary> /// 根节点下的位置业务数据 /// </summary> [JsonProperty("location")] public BusinessLocation Location { get; set; } /// <summary> /// 元数据节点 /// </summary> [JsonProperty("meta")] public MetaNode Meta { get; set; } } /// <summary> /// 元数据节点定义 /// </summary> public class MetaNode { [JsonProperty("inputs")] public MetaInput InputsMeta { get; set; } [JsonProperty("outputs")] public MetaOutput OutputsMeta { get; set; } [JsonProperty("location")] public MetaLocation LocationMeta { get; set; } // 其他meta下的属性按实际结构补充 } // 按实际JSON字段补充以下类的属性: // 业务数据类:BusinessInput、BusinessOutput、BusinessLocation // 元数据类:MetaInput、MetaOutput、MetaLocation
反序列化操作说明
- 该API返回的是单个JSON对象,无需使用
List<Root>反序列化,直接使用根类即可 - 代码示例(Newtonsoft.Json):
// jsonString为API返回的完整JSON字符串 var response = JsonConvert.DeserializeObject<SolarRadiationRoot>(jsonString);
- 代码示例(System.Text.Json):
var response = JsonSerializer.Deserialize<SolarRadiationRoot>(jsonString);
历史失败原因排查
- Json2csharp自动合并同名不同结构节点,生成的类属性无法同时匹配两种结构,导致反序列化时字段映射失败
- 尝试反序列化为
List<Root>属于结构判断错误,该JSON根节点为对象而非数组,会直接抛出类型不匹配异常
内容的提问来源于stack exchange,提问作者Matias Halac
相关产品推荐
相关产品推荐

