JSON反序列化报错:String类型无法转为System.Int32求助
问题解决
错误原因
- 类型不匹配:
Product类中Id字段定义为int类型,但products.json里的id是字符串格式(如"jenlooper-cactus"),JSON序列化器无法将字符串转换为整数,直接触发类型转换错误。 - 缺失字段:
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
相关产品推荐
相关产品推荐

