使用JsonConvert反序列化JSON得到空值该如何处理?
反序列化失败的核心原因
- 属性类型不匹配:原代码中三个实体属性均声明为
char类型,对应JSON字段的实际值为长字符串,char仅能存储单个字符,完全无法承接字符串值,反序列化匹配直接失败。 - 类结构与JSON层级错位:目标JSON的最外层为包含
Data数组的对象,数组元素才是带Comments/TimeStamp/UserName字段的记录,原实体直接将这三个字段作为根节点属性,层级完全不对应,最终得到的对象所有属性都是默认值,看起来就像反序列化结果为空。 - 输入字符串格式异常:给定的JSON示例外层包裹了额外的双引号、末尾附带转义换行符,若直接传入未做清洗,会导致序列化器识别不到合法JSON结构。
调整后的强类型实现代码
原代码中定义的DBData类无需废弃,只需将内部的char类型属性全部替换为string,即可直接复用为数组元素的对应实体,整体代码如下:
using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; // 复用原DBData类,仅修正属性类型 public class DBData { [JsonProperty("Comments")] public string Comments { get; set; } [JsonProperty("TimeStamp")] public string TimeStamp { get; set; } [JsonProperty("UserName")] public string UserName { get; set; } } // 新增匹配JSON最外层结构的根实体类 public class RootEntity { [JsonProperty("Data")] public List<DBData> Data { get; set; } } void fun(string jsonData) { // 清洗输入:去除首尾多余引号、清除末尾转义换行符 var cleanedJson = jsonData.Trim('"', '\n'); // 按匹配的实体结构反序列化 var result = JsonConvert.DeserializeObject<RootEntity>(cleanedJson); // 读取记录示例 var firstRecord = result.Data.FirstOrDefault(); }
轻量解析方案(无需预定义实体)
如果不需要强类型校验,可以直接使用内置的JObject节点解析能力取值,省去实体定义步骤:
void fun(string jsonData) { var cleanedJson = jsonData.Trim('"', '\n'); var jsonObj = JObject.Parse(cleanedJson); // 直接读取数组内第一个元素的字段值 var comments = jsonObj["Data"][0]["Comments"].ToString(); var timeStamp = jsonObj["Data"][0]["TimeStamp"].ToString(); var userName = jsonObj["Data"][0]["UserName"].ToString(); }
内容的提问来源于stack exchange,提问作者user3064181
相关产品推荐
相关产品推荐

