JSON反序列化为C#对象时无法获取Itineraries列表问题求助
问题原因
- 第一,JSON结构与反序列化目标类结构不匹配:当前JSON最外层是包含
data字段的对象,直接反序列化为Data类时,外层对象不存在与itineraries匹配的属性,最终得到的Data对象中的列表会保持初始化的空值。 - 第二,属性名大小写不匹配:JSON中
data节点下的数组字段为大写开头的Itineraries,默认System.Text.Json序列化器区分属性名大小写,无法自动映射到C#类中小写开头的itineraries属性。
修复方案
步骤1:补充根节点类,适配JSON外层结构
新增根类对应JSON最外层对象:
public class RootObject { public Data data { get; set; } }
步骤2:修复属性映射问题,以下两种方案二选一即可
方案A:通过特性指定属性映射(推荐,不影响C#命名规范)
给Data类的列表属性添加JsonPropertyName特性,显式指定对应JSON的字段名:
using System.Text.Json.Serialization; public class Data { [JsonPropertyName("Itineraries")] // 类名建议调整为符合C# Pascal规范的Itinerary,非强制 public List<Itinerary> Itineraries { get; set; } = new List<Itinerary>(); } public class Itinerary { public bool isDomestic { get; set; } public string departureAirport { get; set; } public string arrivalAirport { get; set; } }
方案B:配置序列化器不区分属性大小写
如果不想修改类定义,可以在反序列化时开启大小写不敏感配置:
var jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
步骤3:修正反序列化和遍历代码
调整反序列化目标为根类,再从根类中读取data节点的列表:
// 若使用方案B,需要把jsonOptions传入Deserialize方法 RootObject root = JsonSerializer.Deserialize<RootObject>(json); foreach (var item in root.data.Itineraries) { Console.WriteLine($"departureAirport:{item.departureAirport}"); }
内容的提问来源于stack exchange,提问作者MB_18
相关产品推荐
相关产品推荐

