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

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);

快速排查小技巧

  1. 先单独序列化你的列表,看看输出结果:Debug.Log(JsonConvert.SerializeObject(itemList)),如果这里输出[{},{},{},{}],说明问题出在类的序列化上;如果输出正常,再查字典的序列化逻辑。
  2. 检查每个实例的成员是否真的有赋值(不是默认的null或空字符串)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:52:09