Unity解析Strapi大型JSON遇序列化问题求助
解决Unity解析Strapi JSON的循环引用与序列化问题
问题根源
你遇到的序列化深度超限警告,是因为Strapi返回的JSON存在循环引用:Audio.data 嵌套了 Attributes.Audio,而 Attributes.Audio 又指向包含它的 Datum.attributes,形成无限嵌套。Unity原生的JsonUtility不支持处理循环引用,因此解析失败。
1. 选择合适的解析工具
放弃JsonUtility,改用Newtonsoft.Json(Unity官方适配版)。它原生支持循环引用处理,对复杂JSON结构的兼容性远优于JsonUtility,且可通过Unity Package Manager直接安装。
2. 生成对应C#类
方法一:手动构建类(推荐,精准控制)
根据Strapi JSON的结构手动编写C#类,重点处理循环引用:
- 遵循Strapi的标准返回结构:顶级
data数组 → 每个data包含attributes→attributes内是业务字段(如audio) - 对循环引用的字段,用
[JsonIgnore]标记忽略,避免无限序列化
示例类结构:
using Newtonsoft.Json; using System.Collections.Generic; // 顶级响应类 public class StrapiAudioResponse { [JsonProperty("data")] public List<AudioDatum> Data { get; set; } } // 单个数据项 public class AudioDatum { [JsonProperty("attributes")] public AudioAttributes Attributes { get; set; } } // 数据属性 public class AudioAttributes { [JsonProperty("audio")] public AudioInfo Audio { get; set; } // 补充其他业务字段,如标题、描述等 } // 音频信息 public class AudioInfo { [JsonProperty("data")] public AudioData Data { get; set; } // 如果此处存在指向AudioAttributes的循环字段,添加[JsonIgnore]忽略 // [JsonIgnore] // public AudioAttributes ParentAttributes { get; set; } } // 音频数据详情 public class AudioData { [JsonProperty("attributes")] public AudioFileAttributes FileAttributes { get; set; } } // 音频文件属性 public class AudioFileAttributes { [JsonProperty("url")] public string AudioUrl { get; set; } [JsonProperty("name")] public string AudioName { get; set; } }
方法二:自动生成类
将Strapi的JSON内容复制到JSON转C#类工具(如本地运行的代码生成器、Unity编辑器内的JSON解析插件),生成基础类后,手动添加[JsonProperty]别名和[JsonIgnore]处理循环引用。
3. 具体解析步骤
步骤1:安装Newtonsoft.Json
打开Unity的Package Manager(Window > Package Manager),搜索com.unity.nuget.newtonsoft-json并安装。
步骤2:解析JSON字符串
获取Strapi返回的JSON内容(从本地文件或网络请求读取),使用Newtonsoft.Json解析,开启循环引用忽略:
using Newtonsoft.Json; using UnityEngine; public class StrapiJsonParser : MonoBehaviour { public TextAsset jsonFile; // 在Inspector中挂载JSON文件 void Start() { // 读取JSON内容 string jsonContent = jsonFile.text; // 解析JSON,忽略循环引用 var serializerSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; var response = JsonConvert.DeserializeObject<StrapiAudioResponse>(jsonContent, serializerSettings); // 遍历并使用数据 foreach (var datum in response.Data) { string audioUrl = datum.Attributes.Audio.Data.FileAttributes.AudioUrl; Debug.Log($"音频URL:{audioUrl}"); // 后续可通过Unity的AudioClip加载并播放音频 } } }
步骤3:处理音频展示
解析完成后,可使用Unity的UnityWebRequest加载音频URL,转换为AudioClip后通过AudioSource播放。
内容的提问来源于stack exchange,提问作者Annu
相关产品推荐
相关产品推荐

