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
相关产品推荐
相关产品推荐

