C# VS2019中将JSON字符串反序列化为自定义Root模型对象的方法
可行性结论
你写的Root MyObject = JsonConvert.DeserializeObject<Root>(result); 本身逻辑是成立的,但要满足几个前置条件,同时规避几个常见坑,不然会出现反序列化报错、字段值为null/默认值的问题。
前置依赖检查
- 首先确认项目已经通过NuGet安装了
Newtonsoft.Json(Json.NET)包,否则JsonConvert类型无法识别,代码直接编译不通过。 - 确认所有自定义模型类、嵌套类的访问修饰符都是
public,你贴出的代码里这块没问题,注意如果有嵌套类漏写public,运行时会因为无法实例化对象导致反序列化失败。
核心风险排查
你贴出的JSON片段里存在大量异常断字空格(比如"B uilding_Configuration.Parameters_SP"、"sectio ns":[]),如果这不是你粘贴内容时的排版问题,而是接口实际返回的内容,那反序列化必然匹配失败:
- 第一步先打调试断点,把运行时拿到的完整
result值复制出来,先校验是不是合法完整的JSON,排除接口报错返回HTML、响应内容截断、夹杂无关字符的情况。 - Newtonsoft.Json默认大小写不敏感匹配属性名,普通字段只要名称对应一般不会出错,但你
Configuration类里那些带点号的特殊字段名,必须通过[JsonProperty]特性标注和JSON完全一致的字段名,你贴出的这部分写法是正确的。 - 注意值类型匹配问题:如果JSON里对应字段可能返回null,值类型(int、bool、double等)要定义成可空类型(比如
int?、bool?),否则会抛类型转换异常;不确定字段类型的话可以先临时定义为object兜底。
更稳妥的实现写法
不建议用.Result做同步阻塞调用,很容易在UI/ASP.NET上下文里触发死锁,推荐用异步写法,同时加序列化配置减少不必要的报错:
using Newtonsoft.Json; using System.Net.Http; // 放在异步方法内执行 var response = await client.PostAsync(endpoint, payload); // 先校验HTTP请求状态,排除4xx/5xx错误返回非JSON内容的情况 response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); // 序列化配置:忽略JSON中存在但模型没定义的字段,忽略null值 var jsonSettings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; Root MyObject = JsonConvert.DeserializeObject<Root>(result, jsonSettings);
异常排查顺序
如果反序列化结果不符合预期,按这个顺序定位问题:
- 校验拿到的
result是不是完整合法的目标JSON,排除接口返回错误页、内容截断的问题 - 逐字段对比JSON键名和模型属性/
[JsonProperty]标注的名称,尤其是带特殊字符、点号、下划线的字段,半角全角、多一个空格少一个字符都会匹配失败 - 检查字段类型是否和JSON返回值匹配,比如JSON返回小数你定义成int、JSON返回字符串"true"/"false"你定义成bool类型,都会导致转换失败
- 检查嵌套结构是否对应,比如你JSON里sections是递归嵌套结构,你模型里Sections类也定义了
List<Sections> sections属性,这块结构是匹配的。
你代码里定义的Value3、Variable3类如果JSON里没有对应字段也不会有影响,配置了忽略缺失成员后会自动跳过。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

