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

