JSON反序列化报错:输入字符串'463.8525'不是有效整数
问题分析
反序列化JSON时触发错误:Input String '463.8525' is not a valid integer,且错误指向vat字段。核心原因是JSON中vat值的实际类型与模型定义的double类型不匹配——尽管你提供的JSON示例里vat是数字格式,但实际接口可能返回了字符串格式的小数(如"463.8525"),或者系统文化设置导致小数点解析逻辑冲突,让Json.NET误将其当作整数解析。另外你尝试的[JsonIgnore]无效,大概率是配置不规范导致。
解决方案
方案1:自定义转换器兼容字符串/数字格式的vat
如果接口返回的vat类型不稳定(有时是数字,有时是字符串),可以添加自定义JSON转换器强制解析为double:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; public class StringToDoubleConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(double) || objectType == typeof(double?); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; if (double.TryParse(reader.Value.ToString(), out double result)) return result; throw new JsonSerializationException($"无法将值 {reader.Value} 转换为double类型"); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(value); } }
在模型的vat字段上绑定该转换器:
[JsonConverter(typeof(StringToDoubleConverter))] public double vat { get; set; }
方案2:调整模型字段类型提升容错性
- 改为可空
double类型,允许字段为空:
public double? vat { get; set; }
- 或者先定义为字符串,后续手动转换为数值:
public string vat { get; set; } // 业务逻辑中转换: double vatValue = double.Parse(customer.vat, System.Globalization.CultureInfo.InvariantCulture);
方案3:让[JsonIgnore]生效
如果确实需要忽略vat字段,确保以下两点:
- 引用
Newtonsoft.Json命名空间; - 正确在
vat字段上添加属性:
using Newtonsoft.Json; public class customer { // ... 其他字段 [JsonIgnore] public double vat { get; set; } // ... 其他字段 }
方案4:指定文化信息解析小数点
如果是系统区域设置导致的小数点解析错误(比如用逗号作为小数点分隔符),反序列化时指定不变文化:
var settings = new JsonSerializerSettings { Culture = System.Globalization.CultureInfo.InvariantCulture }; var data = JsonConvert.DeserializeObject<Data>(readTask, settings);
额外排查
检查Lastpayments类中的字段(如amountPaid为int?),如果JSON中该字段是小数,也可能引发类似错误,但根据你的错误提示,优先聚焦vat字段的类型匹配问题。
内容的提问来源于stack exchange,提问作者Haybee
相关产品推荐
相关产品推荐

