
本文详解 Unity 使用 JsonUtility 解析 PHP 返回的嵌套 JSON 时的常见类型不匹配问题,重点解决因 JSON 结构与 C# 类定义不一致导致字段为空的问题,并提供可直接复用的序列化类模板与完整解析流程。
本文详解 unity 使用 `jsonutility` 解析 php 返回的嵌套 json 时的常见类型不匹配问题,重点解决因 json 结构与 c# 类定义不一致导致字段为空的问题,并提供可直接复用的序列化类模板与完整解析流程。
Unity 的 JsonUtility.FromJson<T>() 是一个轻量、高效但严格受限的 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;
}⚠️ 关键注意:
立即学习“PHP免费学习笔记(深入)”;
- 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;✅ 补充建议与最佳实践
-
避免硬编码数组长度:原代码中 new OVHJsonObject[9] 容易越界或浪费内存。推荐改用 List<WalletEntry> 动态存储:
public List<WalletEntry> walletList = new List<WalletEntry>(); // 解析后:walletList = new List<WalletEntry>(response.Wallet_Number);
日期与数字格式处理: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<T>()。
通过精准匹配 JSON 结构与 C# 序列化类,即可彻底解决字段为空问题,让 Unity 稳定可靠地消费 PHP 后端数据。



















