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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:31:43