You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Newtonsoft Json序列化对象生成完整嵌套空结构?

问题描述

我尝试使用Newtonsoft Json打印对象的JSON结构,示例类结构如下:

class details1{
 public string var1;
 public List<details2> list1;
}

class details2{
 public string var2;
 public List<details3> list2;
}

class details3{
 public string var3;
}

我期望得到包含空字符串与嵌套空对象列表的完整JSON输出:

{
 "var1":"",
 "list1":
 [
  {
   "var2":"",
   "list2":
   [
     {
      "var3":""
     }
   ]
  }
 ]
}

但实际得到的输出为:

{
 "var1":null,
 "list1":null
}

我尝试过使用JsonConvert.SerializeObject和JsonSerializer,结果一致。将details1的list1初始化为空列表后:

class details1{
 public details1(){
  list1=new List<details2>();
 }
 public string var1;
 public List<details2> list1;
}

输出变为:

{
 "var1":null,
 "list1":[]
}

仍无法显示list1中details2的结构,请问我哪里操作有误?

问题原因与解决方案

核心问题

Newtonsoft.Json只会序列化已实例化的对象和列表内容,不会自动为你生成嵌套层级的空对象实例。你当前只初始化了details1的list1为空列表,但列表里没有任何details2对象;同时字符串字段未赋值时默认是null,所以序列化后会显示null而非空字符串。

解决步骤

  • 初始化所有嵌套层级的对象和列表
    需要在每个类的构造函数里,不仅初始化自身的列表,还要给列表添加对应的空对象实例,同时给字符串字段赋空字符串:

    class details1
    {
        public details1()
        {
            var1 = "";
            list1 = new List<details2> { new details2() };
        }
        public string var1;
        public List<details2> list1;
    }
    
    class details2
    {
        public details2()
        {
            var2 = "";
            list2 = new List<details3> { new details3() };
        }
        public string var2;
        public List<details3> list2;
    }
    
    class details3
    {
        public details3()
        {
            var3 = "";
        }
        public string var3;
    }
    
  • 配置序列化选项(可选,更灵活)
    如果不想在构造函数里硬编码初始化,可以通过JsonSerializerSettings配置,让null值的字符串序列化为空字符串,同时确保列表即使为空也显示,但要注意:这种方式依然不会自动生成嵌套对象,只是处理值的显示:

    var settings = new JsonSerializerSettings
    {
        DefaultValueHandling = DefaultValueHandling.Populate,
        NullValueHandling = NullValueHandling.Include
    };
    // 手动实例化所有层级的对象
    var obj = new details1
    {
        var1 = "",
        list1 = new List<details2> 
        { 
            new details2 
            { 
                var2 = "", 
                list2 = new List<details3> { new details3 { var3 = "" } } 
            } 
        }
    };
    string json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
    

验证结果

按照第一种方式修改后,序列化得到的JSON就会和你期望的结构完全一致。

内容的提问来源于stack exchange,提问作者Shobhin Goyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:37:15