当前位置: 首页 > article >正文

Newtonsoft.Json反序列化空值报错?5分钟搞定System.Int32类型转换问题

Newtonsoft.Json反序列化空值处理实战指南当你在C#项目中处理JSON数据时是否遇到过这样的报错信息Error converting value {null} to type System.Int32——这几乎是每个C#开发者在使用Newtonsoft.Json进行反序列化时都会碰到的经典问题。特别是在处理来自第三方API或数据库的JSON数据时空值(null)与值类型(如int)的转换冲突尤为常见。本文将深入剖析这一问题的根源并提供多种实用解决方案帮助你在5分钟内彻底解决这个困扰。1. 问题根源与典型场景JSON作为一种轻量级的数据交换格式在Web开发和API交互中无处不在。而C#作为强类型语言在处理JSON数据时类型系统的严格性往往会与JSON的灵活性产生冲突。最常见的场景是当JSON中包含一个null值而你的C#模型期望的是一个值类型(如int、double等)时Newtonsoft.Json会抛出JsonSerializationException。例如{ userId: 123, age: null, score: 95.5 }对应的C#类定义public class UserProfile { public int UserId { get; set; } public int Age { get; set; } // 这里会出问题 public double Score { get; set; } }当尝试反序列化时Age字段会因为null值无法转换为int而抛出异常。这是因为在.NET中值类型(int, double等)不能为null引用类型(string, object等)可以为nullJSON中的null在反序列化时需要明确如何处理2. 基础解决方案Nullable类型最直接的解决方案是使用C#的可空值类型(Nullable Value Types)。通过在值类型后添加?可以明确表示该字段可以接受null值。修改后的模型类public class UserProfile { public int UserId { get; set; } public int? Age { get; set; } // 使用可空int public double Score { get; set; } }这样修改后当JSON中的Age为null时反序列化会成功Age属性值将为null而不是抛出异常。使用时可以通过HasValue属性检查是否有值if (userProfile.Age.HasValue) { Console.WriteLine($Age: {userProfile.Age.Value}); } else { Console.WriteLine(Age not specified); }优点简单直接代码改动小明确表达了字段的可空性与C#类型系统完美集成缺点需要在模型定义时就确定哪些字段可为null使用时需要频繁检查HasValue可能增加代码复杂度3. 全局配置方案JsonSerializerSettings如果你不想修改模型类或者希望全局处理所有值类型的null值问题可以通过配置JsonSerializerSettings来实现。3.1 NullValueHandling配置Newtonsoft.Json提供了NullValueHandling枚举可以控制null值的处理方式var settings new JsonSerializerSettings { NullValueHandling NullValueHandling.Ignore, MissingMemberHandling MissingMemberHandling.Ignore }; var userProfile JsonConvert.DeserializeObjectUserProfile(jsonString, settings);可用的NullValueHandling选项选项描述Include默认值包含null值Ignore忽略null值不设置对应属性3.2 默认值处理你可以结合DefaultValueHandling来为null值提供默认值var settings new JsonSerializerSettings { DefaultValueHandling DefaultValueHandling.Populate, ContractResolver new DefaultContractResolver { NamingStrategy new CamelCaseNamingStrategy() } };4. 高级方案自定义JsonConverter对于更复杂的需求比如你想把null转换为特定的默认值(如0)或者根据字段名进行特殊处理可以实现自定义的JsonConverter。4.1 基本自定义转换器下面是一个将null转换为0的int转换器示例public class NullToZeroConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType typeof(int); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType JsonToken.Null) { return 0; } return Convert.ToInt32(reader.Value); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(value); } }使用方式var settings new JsonSerializerSettings { Converters new ListJsonConverter { new NullToZeroConverter() } }; var userProfile JsonConvert.DeserializeObjectUserProfile(jsonString, settings);4.2 动态默认值转换器更灵活的版本可以针对不同字段设置不同的默认值public class DynamicDefaultValueConverter : JsonConverter { private readonly Dictionarystring, object _defaultValues; public DynamicDefaultValueConverter(Dictionarystring, object defaultValues) { _defaultValues defaultValues; } public override bool CanConvert(Type objectType) { return objectType.IsValueType !objectType.IsEnum; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType JsonToken.Null) { var path reader.Path; var propertyName path.Split(.).Last(); if (_defaultValues.TryGetValue(propertyName, out var defaultValue)) { return Convert.ChangeType(defaultValue, objectType); } return Activator.CreateInstance(objectType); } return Convert.ChangeType(reader.Value, objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(value); } }使用示例var defaultValues new Dictionarystring, object { { Age, 18 }, // Age字段默认为18 { Score, 60.0 } // Score字段默认为60.0 }; var settings new JsonSerializerSettings { Converters new ListJsonConverter { new DynamicDefaultValueConverter(defaultValues) } };5. 实战技巧与最佳实践在实际项目中处理JSON反序列化问题时以下技巧可能会帮到你5.1 防御性编程策略模型设计在设计数据模型时明确区分必填字段和可选字段必填字段使用普通值类型确保数据完整性可选字段使用可空类型明确表达业务语义输入验证在反序列化前验证JSON结构try { var token JToken.Parse(jsonString); // 检查必要字段是否存在 if (token[requiredField] null) { throw new ArgumentException(Missing required field); } } catch (JsonException ex) { // 处理JSON解析错误 }5.2 性能优化建议重用JsonSerializerSettings避免每次反序列化都创建新的配置对象private static readonly JsonSerializerSettings MySettings new JsonSerializerSettings { NullValueHandling NullValueHandling.Ignore, Converters new ListJsonConverter { new MyCustomConverter() } };使用流式API处理大JSON对于大文件使用JsonTextReaderusing (var streamReader new StreamReader(largefile.json)) using (var jsonReader new JsonTextReader(streamReader)) { var serializer new JsonSerializer(); var data serializer.DeserializeMyType(jsonReader); }5.3 常见问题排查当遇到反序列化问题时可以按照以下步骤排查检查JSON数据的实际内容与模型是否匹配验证类型是否兼容特别是数字类型检查是否有意外的null值查看Newtonsoft.Json的详细错误信息特别是Path属性尝试简化JSON和模型定位具体问题字段try { var result JsonConvert.DeserializeObjectMyType(jsonString); } catch (JsonSerializationException ex) { Console.WriteLine($Error path: {ex.Path}); Console.WriteLine($Error message: {ex.Message}); if (ex.InnerException ! null) { Console.WriteLine($Inner exception: {ex.InnerException.Message}); } }6. 替代方案与生态系统虽然Newtonsoft.Json(Json.NET)是.NET生态中最流行的JSON库但.NET Core 3.0引入了System.Text.Json作为官方替代方案。两者在处理null值上有一些差异特性Newtonsoft.JsonSystem.Text.Json默认null处理抛出异常抛出异常可空值类型支持是是全局null处理配置有有限支持自定义null转换器支持支持如果你使用的是.NET Core 3.0可以考虑迁移到System.Text.Json。其null值处理方式如下var options new JsonSerializerOptions { DefaultIgnoreCondition JsonIgnoreCondition.WhenWritingNull, PropertyNameCaseInsensitive true }; var userProfile JsonSerializer.DeserializeUserProfile(jsonString, options);对于需要处理null值的字段仍然需要使用可空类型public class UserProfile { [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)] public int? Age { get; set; } }在实际项目中我通常会根据项目需求和团队熟悉程度选择JSON库。对于已有项目继续使用Newtonsoft.Json可能更稳妥对于新项目特别是性能敏感型应用System.Text.Json是值得考虑的选择。

相关文章:

Newtonsoft.Json反序列化空值报错?5分钟搞定System.Int32类型转换问题

Newtonsoft.Json反序列化空值处理实战指南 当你在C#项目中处理JSON数据时,是否遇到过这样的报错信息?"Error converting value {null} to type System.Int32"——这几乎是每个C#开发者在使用Newtonsoft.Json进行反序列化时都会碰到的经典问题。…...

踩坑记录:SpringBoot 2.7集成Knife4j OpenAPI3时,@Parameter(required=false)为啥不生效?附解决方案

SpringBoot 2.7与Knife4j深度整合:解决Parameter(requiredfalse)失效的底层逻辑 最近在重构公司内部的一个微服务项目时,遇到了一个看似简单却让人抓狂的问题:明明在接口参数上标注了Parameter(requiredfalse),前端调用时却依然报…...

旅游推荐系统 Python+Django+Vue.js

博主说明:本文项目编号 25009 ,文末自助获取源码 \color{red}{25009,文末自助获取源码} 25009,文末自助获取源码 目录 一、系统介绍1.1 需求分析1.1.1 用户功能描述1.1.2 管理员功能描述 1.2 技术栈 二、演示录屏三、启动教程四、…...

基于CODESYS平台与汇川AM系列PLC的手轮精准对位与ECAT轴协同控制实战解析

1. 手轮与ECAT轴协同控制的核心价值 在精密装配、半导体设备或高精度加工场景中,操作人员经常需要微调设备位置到微米级精度。传统按钮点动方式就像用铁锤雕刻核桃——力度难以把控。而5V差分式手轮配合ECAT总线伺服,相当于给设备装上了"微调旋钮&q…...

从防御者视角复盘:一次完整的钓鱼攻击模拟(Kali+setoolkit)与痕迹分析

从防御者视角复盘:一次完整的钓鱼攻击模拟与痕迹分析 钓鱼攻击一直是网络安全领域中最常见且最具威胁的攻击手段之一。攻击者通过伪装成可信来源,诱导受害者泄露敏感信息。本文将从一个独特的防御者视角出发,通过模拟一次完整的钓鱼攻击过程&…...

CSS如何优化CSS选择器引入_避免过度嵌套保持高性能

CSS选择器匹配从右往左,.header .nav .item:hover需回溯验证父级,而.nav-item:hover直接哈希查找;BEM通过命名契约替代结构依赖;import阻塞并串行加载,应禁用;重排由布局相关API或伪类触发,非选…...

思科模拟器实战:构建高可用校园网络

1. 为什么校园网需要高可用设计 校园网络就像学校的"神经系统",一旦瘫痪整个教学秩序就会乱套。去年我参与过一所重点中学的网络改造项目,当时他们的老网络在期末考试期间突然宕机,导致在线考试系统崩溃,最后不得不启用…...

高精度运算工具类

高精度运算工具类(ArithTool)📖 背景:为什么要用高精度运算?在Java中使用 double 或 float 进行浮点数运算时,经常会遇到精度丢失的问题。这是因为计算机使用二进制存储浮点数,而某些十进制小数…...

快速上手StructBERT语义分析工具:中文句子匹配实战指南

快速上手StructBERT语义分析工具:中文句子匹配实战指南 1. 工具概览与核心价值 StructBERT语义分析工具是一款专为中文文本设计的本地化语义匹配解决方案。它基于阿里达摩院开源的StructBERT-Large模型,通过深度学习技术实现句子级别的语义相似度计算。…...

Intv_ai_mk11 本地开发环境搭建:WSL2 Ubuntu系统部署与调试全攻略

Intv_ai_mk11 本地开发环境搭建:WSL2 Ubuntu系统部署与调试全攻略 1. 为什么选择WSL2进行本地开发 对于Windows平台的开发者来说,直接在本地搭建AI开发环境往往会遇到各种兼容性问题。WSL2(Windows Subsystem for Linux)提供了一…...

AI教材编写秘诀大公开!低查重AI教材生成工具,高效创作不是梦

在编写教材的过程中,如何有效满足多样化的需求? 不同学段的学生在认知能力上存在显著差异,教材内容的深度需要谨慎把握,既不能过于深奥,也不能过于浅显。课堂教学和自主学习的场景各有不同,这要求教材的呈…...

AGV无线充电系统市场洞察:2026-2032年复合增长率(CAGR)为11.3%

据恒州诚思调研数据显示,2025年全球AGV无线充电系统市场规模达2.67亿元,预计到2032年将攀升至5.80亿元,2026-2032年复合增长率(CAGR)为11.3%。这一增长态势背后,是制造业、物流业对自动化、智能化物料搬运系…...

League Akari 助手:5大革新功能重塑你的英雄联盟游戏体验

League Akari 助手:5大革新功能重塑你的英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英雄选择阶段手…...

第11篇:从零搭建AUTOSAR开发环境:工具链选型与安装配置实战

为什么开发环境是AUTOSAR的第一道坎 很多工程师第一次接触AUTOSAR时,最直观的感受不是代码难写,而是“连环境都跑不起来”。AUTOSAR是一个极度依赖工具链的架构体系,传统的Makefile + GCC + JTAG三板斧在这里远远不够。你需要一套完整的商业工具或精心拼凑的开源方案,才能从…...

Unlock Music终极指南:如何免费解锁加密音乐文件,获得真正的音乐自由

Unlock Music终极指南:如何免费解锁加密音乐文件,获得真正的音乐自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev…...

AGV/AMR锂电池市场调研:2026-2032年复合增长率(CAGR)将稳定在11.1%

据恒州诚思2024年Q2最新调研数据显示,全球AGV/AMR锂电池市场规模在2025年预计达5.38亿元,受仓储自动化、智能制造及智慧物流系统扩张驱动,2026-2032年复合增长率(CAGR)将稳定在11.1%,至2032年市场规模有望突…...

保姆级教程:用STM32F103C8T6的PWM驱动红外模块,实现格力空调万能遥控器

从零构建格力空调万能遥控器:基于STM32F103C8T6的PWM红外协议全解析 在智能家居DIY领域,红外遥控器改造一直是最具实用价值的入门项目之一。本文将带您完整实现一个能精准控制格力空调的STM32红外发射器,使用最常见的STM32F103C8T6开发板&…...

ArcGIS数据入库避坑指南:为什么你的BSM标识码总出错?3个常见问题解析

ArcGIS数据入库避坑指南:BSM标识码生成的3个致命陷阱与实战解决方案 自然资源数据入库就像给城市绘制数字身份证,而BSM标识码就是每块土地的"身份证号"。去年某省级国土调查项目中,37%的入库驳回案例都源于标识码错误——要么行政代…...

FPGA 外置Flash的读写,用户数据存储

FPGA 外置Flash的读写,用户数据存储前言一,该功能验证平台及参考文章1,Xilinx xc7k325tffg676-22,vivado 2017.43,验证的flash芯片:MT25QL2564,参考文章:MT25QL256_datasheet5&#…...

MCP23017 vs 74系列芯片:51单片机IO扩展方案对比与实战

MCP23017与74系列芯片:51单片机IO扩展方案深度解析与实战指南 当51单片机的GPIO资源捉襟见肘时,工程师们往往面临两种主流扩展方案的选择:传统的74系列逻辑芯片与现代化的MCP23017端口扩展器。这两种技术路线各具特色,适用于不同的…...

从IF控制到精准定位:Hall自学习如何重塑无感电机控制

1. 为什么我们需要Hall自学习技术 想象一下你正在组装一台电动滑板车。当你把电机装好准备测试时,发现转速总是不稳定,有时候还会突然卡顿。这种情况很可能就是由于电机内部的Hall传感器安装存在物理偏差导致的。传统电机控制模型假设三个Hall传感器之间…...

NumPy 中 transpose 详解

transpose 用于 NumPy 中高维度数组的轴变换,在二维情况下就是通常说的转置。该方法很不好理解,本文详细介绍该方法。 该方法有两个实现,分别是numpy.ndarray.transpose和numpy.transpose,两者分别是类成员方法和独立的方法&…...

FDTD仿真中PDMS光学参数txt文件的获取、验证与应用指南

1. PDMS光学参数在FDTD仿真中的重要性 做光学仿真的人都知道,材料参数准不准直接决定了仿真结果靠不靠谱。我刚开始用FDTD Solutions仿真PDMS微流控器件时,就吃过参数不准的亏——仿真结果和实验数据差了一大截,折腾了好几天才发现是折射率数…...

PPTist在线演示工具:5分钟快速制作专业幻灯片的完整指南

PPTist在线演示工具:5分钟快速制作专业幻灯片的完整指南 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing …...

【数据库】Redis的线程与IO

百万笔记知识库, 所有基础的笔记都在这里面啦,点击左边蓝字即可获取!助力每一位未来架构师! 欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘 文章目录线程模型通信流程文件事件处理器…...

《手把手教你评估二手车》林绪东 读书笔记

目录笔记一.事故车鉴定1.车漆2.缝隙及整车3.车身骨架笔记 一.事故车鉴定 事故车定义:存在结构性损伤的车辆,以及泡水、火烧车等。 不可通过拆卸螺丝更换的部件,多为结构件。 1.车漆 目的:1.车漆→车伤;2.车漆扣费 检…...

终极指南:如何免费解锁Cursor Pro全部功能,实现无限AI编程助手体验

终极指南:如何免费解锁Cursor Pro全部功能,实现无限AI编程助手体验 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能:…...

SAP PP实战:MRP Area怎么用?手把手教你按产线、委外供应商拆分物料计划

SAP PP实战:MRP Area精细化物料计划管理指南 引言 在制造业生产计划管理中,物料需求计划(MRP)的精确性直接影响着生产效率与成本控制。传统以工厂为单位的MRP运行模式往往难以应对复杂生产环境下的精细化需求——当多条产线并行运…...

Gold-YOLO:从论文到实践,深入剖析其高效目标检测的聚合-分发机制

1. 为什么需要Gold-YOLO的聚合-分发机制 目标检测领域有个经典难题:如何让模型同时看清远处的小目标和近处的大目标?这个问题困扰了研究者多年。传统解决方案FPN(特征金字塔网络)和PANet虽然在一定程度上缓解了多尺度检测的困难&a…...

上门做饭系统的数据可视化大屏:基于Echarts的实时业务监控与源码剖析

一、系统架构总览与业务背景1.1 上门做饭系统业务场景分析上门做饭系统是一种创新的O2O生活服务平台,连接专业厨师与有烹饪需求的用户。系统核心业务包括:用户端App(下单、支付、评价)、厨师端App(接单、路线规划、服务…...