如何在 Unity 中正确解析嵌套 JSON 数据(PHP 后端返回结构)

老辰大大_3444

老辰大大_3444

2026-04-02

614人浏览

原创

如何在 Unity 中正确解析嵌套 JSON 数据(PHP 后端返回结构)

本文详解 Unity 使用 JsonUtility 解析 PHP 返回的嵌套 JSON 时的常见类型不匹配问题,重点解决因 JSON 结构与 C# 类定义不一致导致字段为空的问题,并提供可直接复用的序列化类模板与完整解析流程。

本文详解 unity 使用 `jsonutility` 解析 php 返回的嵌套 json 时的常见类型不匹配问题,重点解决因 json 结构与 c# 类定义不一致导致字段为空的问题,并提供可直接复用的序列化类模板与完整解析流程。

Unity 的 JsonUtility.FromJson() 是一个轻量、高效但严格受限的 JSON 反序列化工具——它仅支持符合特定规则的 C# 类型(如 [Serializable] 类、基础类型、一维数组),且要求 JSON 键名与 C# 字段名完全一致、嵌套层级必须精确映射。你遇到的 Wallet_data[0].Wallet_Number 始终为空,根本原因在于:PHP 返回的 JSON 是顶层包含 Wallet_Number 数组和 content 字段的对象,而你的 OVHJsonObject 类试图将整个 JSON 直接反序列化为单个对象,导致结构错位,所有字段均无法绑定。

✅ 正确的 C# 类结构设计

需严格对应 PHP 输出的 JSON 结构:

{
  "Wallet_Number": [
    { "Wallet_Number": "...", "NFT": "...", "Montant_Mise": "...", "Date_Spin": "..." },
    ...
  ],
  "content": 6
}

因此,应定义两个嵌套的 [Serializable] 类:

[System.Serializable]
public class WalletEntry
{
    public string Wallet_Number;
    public string NFT;
    public string Montant_Mise;
    public string Date_Spin;
}

[System.Serializable]
public class WalletResponse
{
    public WalletEntry[] Wallet_Number; // 注意:字段名必须与 JSON key 完全相同(含大小写)
    public int content;
}

⚠️ 关键注意:

  • Wallet_Number 在 JSON 中既是顶层字段名,又是数组内对象的字段名,这是合法的,但 C# 中需用不同类名区分语义(如 WalletEntry)避免歧义;
  • WalletResponse.Wallet_Number 是 WalletEntry[] 类型,而非 string —— 这是修复空值的核心;
  • 所有字段必须为 public,且不可使用 readonly 或属性(get/set),否则 JsonUtility 将忽略。

✅ 正确的解析逻辑(替换原 GetRequest 中的解析部分)

case UnityWebRequest.Result.Success:
    Debug.Log("Received: " + webRequest.downloadHandler.text);

    // 使用正确的类型反序列化整个响应
    WalletResponse response = JsonUtility.FromJson<walletresponse>(webRequest.downloadHandler.text);

    // 安全访问:先检查数组是否非空
    if (response.Wallet_Number != null && response.Wallet_Number.Length > 0)
    {
        Debug.Log("First Wallet Number: " + response.Wallet_Number[0].Wallet_Number);
        Debug.Log("Total Records: " + response.content);

        // 可选:复制到你的全局数组(注意长度匹配)
        System.Array.Copy(response.Wallet_Number, Wallet_data, 
            Mathf.Min(response.Wallet_Number.Length, Wallet_data.Length));
    }
    else
    {
        Debug.LogWarning("No wallet data received.");
    }
    break;</walletresponse>

✅ 补充建议与最佳实践

  • 避免硬编码数组长度:原代码中 new OVHJsonObject[9] 容易越界或浪费内存。推荐改用 List 动态存储:

    public List<walletentry> walletList = new List<walletentry>();
    // 解析后:walletList = new List<walletentry>(response.Wallet_Number);</walletentry></walletentry></walletentry>
  • 日期与数字格式处理:Montant_Mise 在 JSON 中为字符串(如 "0,01"),若需计算,请在 C# 中用 float.Parse(value.Replace(",", ".")) 转换(注意文化差异);Date_Spin 建议 PHP 端统一输出 ISO 格式(如 "2022-04-06"),便于 DateTime.TryParse() 解析。

  • 错误防御:JsonUtility.FromJson 在 JSON 格式错误时静默失败(返回默认值),务必配合 string.IsNullOrEmpty() 和空数组检查。

  • 替代方案(进阶):如需更灵活解析(如动态 key、复杂嵌套、null 安全),推荐使用 Newtonsoft.Json(需导入 Unity Package Manager 的 com.unity.nuget.newtonsoft-json),支持 JObject.Parse() 和强类型泛型 JsonConvert.DeserializeObject()。

通过精准匹配 JSON 结构与 C# 序列化类,即可彻底解决字段为空问题,让 Unity 稳定可靠地消费 PHP 后端数据。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2583

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6610

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6026

10

php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11184

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6501

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4108

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4814

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3791

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习