如何将JSON字符串中的数组正确反序列化为C#对象?
C# JSON反序列化空数组异常修正方案
核心错误原因
你当前代码存在两个导致异常/逻辑错误的问题:
LastName字段在返回的JSON结构中是字符串类型,代码中写的token.Value<bool>("LastName")存在类型不匹配问题,运行时会触发类型转换错误。Links字段的反序列化逻辑错误:token.Value<Array>("Links")取到的是.NET基础Array类型,既不符合Newtonsoft.Json要求的JsonReader/JToken输入类型,也无法被序列化器正确识别,因此抛出类型转换异常,且该写法无法兼容空数组场景。
修正后可运行代码
首先确保你已经引入了对应依赖的命名空间:
using Newtonsoft.Json.Linq; // 若使用System.Text.Json做反序列化,需额外引入 // using System.Text.Json;
解析逻辑修正如下,空数组场景会自动返回长度为0的对应泛型列表,不会触发异常:
var token = JObject.Parse(Json); var Id = token.Value<string>("Id"); var fname = token.Value<string>("FirstName"); // 修正LastName的类型转换错误,原代码写的bool类型和JSON结构不匹配 var lbname = token.Value<string>("LastName"); // 推荐写法:直接用Newtonsoft内置的ToObject方法,代码最简洁,空数组/有数据场景均兼容 var links = token["Links"].ToObject<List<LinkService>>(); // 如果你必须使用System.Text.Json的JsonSerializer做反序列化,替换为下面这行即可 // var links = JsonSerializer.Deserialize<List<LinkService>>(token["Links"].ToString());
注意事项
- 不要尝试将JToken下的JSON数组直接转换为.NET基础
Array类型,通过JObject索引器token["Links"]取到的内容本身就是对应JSON数组的JArray实例,内置的ToObject<T>()方法已经兼容空数组、正常数组对象的所有转换场景。 - 所有字段取值前要先和JSON结构核对类型,避免出现字符串转布尔这类基础类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Georgia
相关产品推荐
相关产品推荐

