如何用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
相关产品推荐
相关产品推荐

