C#使用JSON文件作为API数据库时反序列化报错如何解决
问题原因&解决步骤
1. 反序列化类型不匹配错误原因
你的JSON根节点是包含Items字段的对象,不是直接的产品数组,直接反序列化为List<Product>会触发类型不匹配错误。
2. 字段全为null的原因
- JSON键名是小写开头(如
id/name),C#属性默认是大写开头,无映射配置时无法匹配赋值 - 你定义的
Tags类多余,JSON中tags是字符串数组,直接用List<string>接收即可
注意:你提供的JSON示例里数组最后一个元素末尾多了逗号,部分严格的JSON解析器会报错,建议删除多余逗号。
修正后的代码
模型定义
// 新增根节点类,对应JSON外层结构 public class RootData { public List<Product> Items { get; set; } } public class Product { // JsonProperty映射JSON的小写键名 [JsonProperty("id")] public int ID { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("price")] public decimal Price { get; set; } [JsonProperty("image")] public string Image { get; set; } [JsonProperty("description")] public string Description { get; set; } // 改为字符串列表,对应JSON的字符串数组,删除原有的Tags类 [JsonProperty("tags")] public List<string> Tags { get; set; } [JsonProperty("category")] public string Category { get; set; } }
控制器代码
[ApiController] [Route("api/[controller]")] public class ProductController : Controller { [HttpGet] public IEnumerable<Product> Get() { // 用using包裹StreamReader自动释放资源 using StreamReader r = new StreamReader("./items.json"); string jsonString = r.ReadToEnd(); // 先反序列化为根节点类,再取Items返回 RootData rootData = JsonConvert.DeserializeObject<RootData>(jsonString); return rootData.Items; } }
可选优化
如果你不想给每个属性加[JsonProperty],可以配置Newtonsoft.Json反序列化时自动匹配驼峰命名:
RootData rootData = JsonConvert.DeserializeObject<RootData>(jsonString, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
内容的提问来源于stack exchange,提问作者Mario Garcia
相关产品推荐
相关产品推荐

