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

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"));
    }
}

关键修改点

  1. 新增RandomUserResponse和User类,完全匹配API返回的JSON层级结构
  2. 调整反序列化逻辑,先解析完整响应,再从results数组中提取用户姓名
  3. 修复NewRequest方法:直接发起请求协程,避免手动调用Unity生命周期方法Start()
  4. 增加了空值检查,避免数组为空或字段缺失导致的异常

内容的提问来源于stack exchange,提问作者user21403547

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:48:16