You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:18:03