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

Unity Windows构建中Newtonsoft.Json反序列化仅获默认值问题

Unity打包Windows后Newtonsoft.Json反序列化数据为空/默认值问题

Unity编辑器中使用JsonConvert.DeserializeObject<UIContentData>(json)加载JSON数据完全正常,JSON格式也有效,但打包为Windows构建后,反序列化的数据出现空值或被填充默认值。将反序列化后的对象重新序列化,结果如下:

原始读取的JSON字符串

{
    "galleries": [{
        "id": "Acker",
        "title": "Auf dem Acker",
        "slides": [],
        "path": "/ChangeableContentData/Auf dem Acker",
        "showAllInFolder": true,
        "foldersRecursive": false,
        "enableSlideshow": false,
        "slideshowSlideDuration": 5.0
    }],
    "cardMenus": [],
    "urls": []
}

反序列化后重新序列化的结果

{
    "galleries": [{
        "id": null,
        "title": "",
        "slides": null,
        "path": "",
        "showAllInFolder": true,
        "foldersRecursive": true,
        "enableSlideshow": false,
        "slideshowSlideDuration": 5.0
    }],
    "cardMenus": []
}

相关C#数据类

[System.Serializable]
[Preserve]
public partial class UIContentData
{
    [JsonProperty("galleries")]
    public List<UIContentGalleryData> galleries { get; set; }
    [JsonProperty("cardMenus")]
    public List<UIContentCardMenuData> cardMenus { get; set; }
    [JsonProperty("urls")]
    public List<UIContentUrlData> urls { get; set; }

    public UIContentData() { }
}

[System.Serializable]
[Preserve]
public partial class UIContentGalleryData
{
    public string id { get; set; }
    [JsonProperty("title")]
    public string title { get; set; } = ""; // optional
    [JsonProperty("slides")]
    public List<UIContentGallerySlide> slides { get; set; }
    [JsonProperty("path")]
    public string baseFolderPath { get; set; } = "";
    [JsonProperty("showAllInFolder")]
    public bool showAllInFolder { get; set; } = true; // optional
    [JsonProperty("foldersRecursive")]
    public bool foldersRecursive { get; set; } = true; // optional
    [JsonProperty("enableSlideshow")]
    public bool enableSlideshow { get; set; } = false; // optional
    [JsonProperty("slideshowSlideDuration")]
    public float slideshowSlideDuration { get; set; } = 5f; // optional

    public UIContentGalleryData() { }
}

解决方案

  • 给UIContentGalleryData的id字段添加[JsonProperty("id")]特性,明确JSON字段与类属性的映射关系:
    [JsonProperty("id")]
    public string id { get; set; }
    
  • 检查Unity的IL2CPP代码裁剪设置:在Player Settings > Other Settings > Configuration中,将Managed Stripping Level调整为Medium或Low(若当前为High),避免Newtonsoft.Json反射所需的类成员被裁剪。
  • 添加链接器配置文件(link.xml),确保自定义数据类和Newtonsoft.Json相关类型不被裁剪。文件内容示例:
    <linker>
      <assembly fullname="Newtonsoft.Json" preserve="all"/>
      <assembly fullname="[你的程序集名称]">
        <type fullname="UIContentData" preserve="all"/>
        <type fullname="UIContentGalleryData" preserve="all"/>
        <type fullname="UIContentGallerySlide" preserve="all"/>
        <type fullname="UIContentCardMenuData" preserve="all"/>
        <type fullname="UIContentUrlData" preserve="all"/>
      </assembly>
    </linker>
    
  • 确保UIContentGallerySlide类也添加了[System.Serializable]和[Preserve]特性,否则反序列化空数组时无法正确初始化列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:18:36