C#使用System.Text.Json读JSON转IEnumerable报JsonException如何解决
问题根源
你的JSON文件根节点是对象数组(用[]包裹),但你当前代码尝试将其反序列化为Dictionary<string, string[]>类型——Dictionary对应的JSON结构是键值对对象(用{}包裹),二者结构完全不匹配,所以触发类型转换报错。
解决方案
步骤1:定义匹配JSON结构的实体类
先声明一个和JSON单条数据结构对应的类:
public class MedicalAdvisor { public string Name { get; set; } public string Endpoint { get; set; } public string Country { get; set; } }
如果需要严格匹配JSON小写属性名,可给属性添加[JsonPropertyName("name")]特性,或在反序列化时配置大小写不敏感选项。
步骤2:修改反序列化逻辑
如果需求是返回IEnumerable类型结果,直接修改反序列化目标类型即可:
private static IEnumerable<MedicalAdvisor>? GetStaticMedicalAdvisors() { var json = System.IO.File.ReadAllText("MedicalAdvisors.json"); var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true // 忽略JSON属性和C#属性的大小写差异 }; return JsonSerializer.Deserialize<IEnumerable<MedicalAdvisor>>(json, options); }
若确实需要返回Dictionary结构
如果业务要求返回Dictionary<string, string[]>,可先反序列化为列表,再手动转换为字典,示例以姓名作为key,其余字段作为value数组:
private static Dictionary<string, string[]>? GetStaticMedicalAdvisors() { var json = System.IO.File.ReadAllText("MedicalAdvisors.json"); var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var list = JsonSerializer.Deserialize<List<MedicalAdvisor>>(json, options); return list?.ToDictionary( x => x.Name, x => new[] { x.Endpoint, x.Country } ); }
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

