Unity中解析多变量JSON遇问题,代码返回null求修复
问题分析与修复方案
问题根源
randomuser.me/api的JSON是多层嵌套+数组结构,和你之前处理的单变量JSON完全不同:
它的返回结构大致是:
{ "results": [ { "name": { "title": "Mr", "first": "John", "last": "Doe" } // 其他字段... } ] }
你的代码直接用Name类反序列化整个JSON,完全不匹配层级结构,自然会返回null。
修复步骤与完整代码
需要定义匹配JSON结构的类,并调整反序列化逻辑:
using UnityEngine; using TMPro; using UnityEngine.Networking; using System.Collections; using System; using Newtonsoft.Json; using System.Collections.Generic; public class Service : MonoBehaviour { [SerializeField] private TextMeshProUGUI _text; private void Start() { StartCoroutine(GetRequest("https://randomuser.me/api")); } private IEnumerator GetRequest(String url) { using (UnityWebRequest webRequest = UnityWebRequest.Get(url)) { yield return webRequest.SendWebRequest(); switch (webRequest.result) { case UnityWebRequest.Result.ConnectionError: case UnityWebRequest.Result.DataProcessingError: _text.text = "Error: " + webRequest.error; break; case UnityWebRequest.Result.ProtocolError: _text.text = "HTTP Error: " + webRequest.error; break; case UnityWebRequest.Result.Success: if (CheckAPI(webRequest)) { // 反序列化为完整的响应结构 RandomUserResponse response = JsonConvert.DeserializeObject<RandomUserResponse>(webRequest.downloadHandler.text); // 检查results数组是否有数据 if (response?.results == null || response.results.Count == 0) { _text.text = "Error: 未获取到用户数据"; break; } Name name = response.results[0].name; if (name.title == null || name.first == null || name.last == null) { _text.text = "Error: 用户姓名数据缺失"; } else { _text.text = $"{name.title} {name.first} {name.last}"; } } else { _text.text = "Error: 非JSON格式的API响应"; } break; } } } private bool CheckAPI(UnityWebRequest data) { string contentType = data.GetResponseHeader("Content-Type"); return !string.IsNullOrEmpty(contentType) && contentType.Contains("application/json"); } // 对应整个API响应的结构 public class RandomUserResponse { public List<User> results { get; set; } } // 对应单个用户的结构 public class User { public Name name { get; set; } } // 保留原有的姓名结构类 public class Name { public string title { get; set; } public string first { get; set; } public string last { get; set; } } // 修复NewRequest方法:不要手动调用生命周期方法Start() public void NewRequest() { StartCoroutine(GetRequest("https://randomuser.me/api")); } }
关键修改点
- 新增
RandomUserResponse和User类,完全匹配API返回的JSON层级结构 - 调整反序列化逻辑,先解析完整响应,再从
results数组中提取用户姓名 - 修复
NewRequest方法:直接发起请求协程,避免手动调用Unity生命周期方法Start() - 增加了空值检查,避免数组为空或字段缺失导致的异常
内容的提问来源于stack exchange,提问作者user21403547
相关产品推荐
相关产品推荐

