Unity中C#含List的类转JSON生成空对象问题排查
问题排查与解决方案
嘿,我来帮你搞定这个JSON序列化的问题!根据你描述的情况——转换前列表明明有4个实例,但序列化后对应键的值变成了{}——大概率是序列化规则或者类的定义出了问题,下面分几种常见情况给你拆解:
1. 自定义类不符合序列化器要求
不同的C# JSON序列化器(比如Unity的JsonUtility、Newtonsoft.Json、System.Text.Json)对类的要求不一样,这是最常见的坑:
如果用Unity自带的
JsonUtility:- 类必须标记
[Serializable]特性 - 要序列化的成员必须是公共字段(不能是仅带get/set的属性)
- 不能直接序列化
List<T>,必须把列表包装在一个带[Serializable]的类里
错误示例:
// 没有标记[Serializable],或者用了属性而非字段 public class MyItem { public string Id { get; set; } // JsonUtility不会序列化这个属性 }正确示例:
[Serializable] public class MyItem { public string Id; public string Value; } // 包装列表的类 [Serializable] public class ItemListWrapper { public List<MyItem> Items; }- 类必须标记
如果用Newtonsoft.Json/System.Text.Json:
- 要序列化的成员必须是公共属性(带getter和setter),或者配置序列化器包含字段
- 类最好有无参数构造函数(部分序列化器会要求)
示例(Newtonsoft.Json):
public class MyItem { public string Id { get; set; } public string Value { get; set; } }
2. 序列化器配置遗漏
如果类定义没问题,但还是输出空对象,可能是序列化器的默认配置忽略了某些内容:
保留默认值:如果你的实例成员都是默认值(比如
null),序列化器可能会忽略它们,导致输出空对象。可以配置强制保留默认值:// Newtonsoft.Json var settings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Include }; string json = JsonConvert.SerializeObject(yourList, settings); // System.Text.Json var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.Never }; string json = JsonSerializer.Serialize(yourList, options);包含字段:如果类用的是字段而非属性,需要开启字段序列化:
// System.Text.Json var options = new JsonSerializerOptions { IncludeFields = true };
3. 错误的序列化方式
你提到要创建“键值均为字符串的JSON字典”,这里要注意:如果你的第二个键对应是对象列表,不能直接把List<T>放到字典里(除非序列化器支持自动转字符串),正确的做法是先把列表序列化为JSON字符串,再作为字典的值:
完整示例(用Newtonsoft.Json):
// 1. 定义可序列化的类 public class MyItem { public string Id { get; set; } public string Value { get; set; } } // 2. 构造数据 var itemList = new List<MyItem> { new MyItem { Id = "1", Value = "First" }, new MyItem { Id = "2", Value = "Second" }, new MyItem { Id = "3", Value = "Third" }, new MyItem { Id = "4", Value = "Fourth" } }; // 3. 把列表序列化为字符串,再放入字典 var tcpDict = new Dictionary<string, string> { ["key1"] = "HelloTCP", ["key2"] = JsonConvert.SerializeObject(itemList) }; // 4. 序列化整个字典为最终JSON string finalJson = JsonConvert.SerializeObject(tcpDict); Debug.Log(finalJson);
快速排查小技巧
- 先单独序列化你的列表,看看输出结果:
Debug.Log(JsonConvert.SerializeObject(itemList)),如果这里输出[{},{},{},{}],说明问题出在类的序列化上;如果输出正常,再查字典的序列化逻辑。 - 检查每个实例的成员是否真的有赋值(不是默认的
null或空字符串)。
内容的提问来源于stack exchange,提问作者Tobsi
相关产品推荐
相关产品推荐

