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

Unity中JsonUtility反序列化REST接口数据报错求助

解决REST请求JSON反序列化的两个常见问题

嘿,刚接触JSON和REST请求的话,遇到这俩坑真的太正常了!我帮你把问题拆解开,再给你实打实的解决办法~

第一个问题:NullReferenceException(空引用异常)

这个问题大概率是你没正确等待异步请求完成,就急着去访问反序列化后的对象属性了。比如你可能写了类似这样的错误代码:

var client = new HttpClient();
var response = client.GetAsync("https://jsonplaceholder.typicode.com/users");
var json = response.Content.ReadAsStringAsync();
var user = JsonSerializer.Deserialize<User>(json.Result);
Console.WriteLine(user.Name); // 这里user大概率是null,直接触发空引用异常

为啥会这样?因为GetAsync和ReadAsStringAsync都是异步方法,没加await的话,代码会跳过等待直接往下走,这时候json.Result可能还没拿到实际的JSON数据,反序列化出来的对象自然是null,访问属性就会报错。

第二个问题:ArgumentException: JSON must represent an object type

这个问题更直接:你反序列化的类型和返回的JSON结构不匹配!你请求的/users接口返回的是一个用户数组(格式是[{...}, {...}]),但你可能用了单个User类型去反序列化,而不是List<User>或者User[]。比如错误代码大概是这样:

// 错误:用单个User类型去反序列化数组格式的JSON
var user = await JsonSerializer.DeserializeAsync<User>(response.Content.ReadAsStreamAsync());

JSON数组没法直接转成单个对象,所以就会抛出这个异常。

正确的解决代码示例

首先定义和接口返回字段匹配的User类(保证属性名和JSON键对应,或者用特性映射):

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    // 可以根据接口返回补充其他属性,比如Address、Phone等
}

然后写正确的异步请求和反序列化逻辑:

using System.Net.Http;
using System.Text.Json;
using System.Collections.Generic;

public async Task GetUsersAsync()
{
    using var client = new HttpClient();
    try
    {
        // 1. 等待请求完成,获取响应
        var response = await client.GetAsync("https://jsonplaceholder.typicode.com/users");
        // 2. 检查响应是否成功,避免无效JSON
        response.EnsureSuccessStatusCode();
        // 3. 等待读取JSON内容,反序列化成列表类型
        var users = await JsonSerializer.DeserializeAsync<List<User>>(await response.Content.ReadAsStreamAsync());
        
        // 现在可以安全访问用户属性啦
        foreach (var user in users)
        {
            Console.WriteLine($"用户名:{user.Name},邮箱:{user.Email}");
        }
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine($"请求出错:{ex.Message}");
    }
    catch (JsonException ex)
    {
        Console.WriteLine($"反序列化出错:{ex.Message}");
    }
}

关键注意点

  • 异步代码一定要加await,别直接用.Result或者.Wait(),容易造成死锁和空引用;
  • 先确认接口返回的JSON结构(是数组还是单个对象),再对应选择反序列化的类型(List<T>/T[]还是单个T);
  • 加上异常处理,覆盖请求失败、JSON格式错误的情况,方便排查问题;
  • 如果JSON字段名和C#属性名不一样,记得用[JsonPropertyName("json字段名")]特性映射,比如:
    [JsonPropertyName("userName")]
    public string Username { get; set; }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:30