You need to enable JavaScript to run this app. 使用JsonConvert反序列化JSON得到空值该如何处理?
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 07:15:07