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

JSON反序列化报错:String类型无法转为System.Int32求助

问题解决

错误原因

  1. 类型不匹配:Product类中Id字段定义为int类型,但products.json里的id是字符串格式(如"jenlooper-cactus"),JSON序列化器无法将字符串转换为整数,直接触发类型转换错误。
  2. 缺失字段:Product类包含Ratings字段,但JSON数据中无对应内容,若不处理后续可能引发额外序列化异常。

解决方案

方案一:修改Product类适配JSON数据(推荐)

将Id字段类型改为string,同时为Ratings字段设置默认值,确保JSON无对应字段时也能正常序列化:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace DevTest.Website.Models
{
    public class Product
    {
        // 将int改为string,匹配JSON中的字符串id格式
        public string Id { get; set; }
        public string Maker { get; set; }
        [JsonPropertyName("img")]
        public string Image { get; set; }
        public string Url { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        // 设置空数组默认值,避免JSON无此字段时序列化失败
        public int[] Ratings { get; set; } = Array.Empty<int>();

        public override string ToString() => JsonSerializer.Serialize<Product>(this);
    }
}

方案二:修改JSON数据适配Product类(不推荐)

若坚持使用int类型的Id,需将JSON中所有id值改为整数(如"id": 1),但此方法会破坏原有数据的业务标识意义,仅适用于特殊场景。

额外优化

在JsonFileProductService的序列化配置中添加忽略空值选项,进一步提升序列化兼容性:

public IEnumerable<Product> GetProducts()
{
    using (var jsonFileReader = File.OpenText(JsonFileName))
    {
        return JsonSerializer.Deserialize<Product[]>(jsonFileReader.ReadToEnd(),
        new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true,
            // 忽略JSON中不存在的字段或空值字段
            IgnoreNullValues = true
        });
    }
}

内容的提问来源于stack exchange,提问作者Hamza Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:15:49