System.Text.Json反序列化JSON为Customer对象列表报错求助
问题根因
你的database.json外层是包含customers字段的对象结构,不是直接的客户数组,你直接将整个JSON反序列化为List<Customer>,类型结构不匹配,所以抛出转换失败的异常。你之前尝试先把JSON反序列化为字符串的写法完全错误,JSON根节点是对象不是字符串,自然会报字符解析错误。
解决方案
方案1:定义外层根包装类(推荐)
新增根节点映射类即可完全复用你现有的反序列化工具方法:
public class CustomerRoot { [JsonProperty("customers")] [JsonPropertyName("customers")] public List<Customer> Customers { get; set; } }
修改反序列化业务代码:
private List<Customer> GetCustomersFromFile() { string jsonString = File.ReadAllText(@"database.json", Encoding.UTF8); var root = GetJsonGenericType<CustomerRoot>(jsonString); return root.Customers; }
原有Customer类和GetJsonGenericType方法不需要做任何修改。
方案2:直接提取数组节点反序列化(无需新增类)
如果你不想额外新增根类,可以先解析JSON结构提取出customers数组节点,再做反序列化:
基于System.Text.Json实现
private List<Customer> GetCustomersFromFile() { string jsonString = File.ReadAllText(@"database.json", Encoding.UTF8); using JsonDocument doc = JsonDocument.Parse(jsonString); JsonElement customersElement = doc.RootElement.GetProperty("customers"); return JsonSerializer.Deserialize<List<Customer>>(customersElement.GetRawText()); }
基于Newtonsoft.Json实现
private List<Customer> GetCustomersFromFile() { string jsonString = File.ReadAllText(@"database.json", Encoding.UTF8); JObject root = JObject.Parse(jsonString); return root["customers"].ToObject<List<Customer>>(); }
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

