调用API获取JSON数据遇JObject键值错误,求问题排查
问题分析与解决
嘿,我来帮你捋清楚这个错误的根源~
首先看你遇到的报错:'Accessed JObject values with invalid key value: 1. Object property name expected.',核心问题是你错误地用数字索引去访问JObject了。JObject对应JSON里的键值对对象,它的键必须是字符串,而你写的jObject[0]相当于在找键为"0"的属性,但你的JSON根对象里根本没有这个键——根对象的有效键是elements,对应的值才是你要遍历的数组。
另外你的代码里还有个完全多余的步骤:先把JSON字符串用JavaScriptSerializer反序列化成dynamic再转成字符串,然后又用JObject.Parse解析,这不仅多此一举,还会破坏JSON的原始结构,导致后续解析逻辑出错。
修正后的代码
using(var httpClient = new HttpClient()) { HttpResponseMessage response = httpClient.GetAsync("api_url_here").Result; var studentJsonString = response.Content.ReadAsStringAsync().Result; // 直接解析原始JSON字符串,跳过无意义的中间转换 JObject jObject = JObject.Parse(studentJsonString); // 先获取"elements"对应的数组(JArray),再遍历其中的每个对象 IEnumerable<StudentModel> studentList = jObject["elements"] .Select(item => new StudentModel { id = item["id"].ToString(), name = item["name"].ToString(), address = item["address"].ToString() }); }
额外优化建议
- 尽量别用
.Result同步等待异步方法,建议改用async/await,避免出现死锁问题:
public async Task<IEnumerable<StudentModel>> GetStudentsAsync() { using(var httpClient = new HttpClient()) { HttpResponseMessage response = await httpClient.GetAsync("api_url_here"); var studentJsonString = await response.Content.ReadAsStringAsync(); JObject jObject = JObject.Parse(studentJsonString); return jObject["elements"] .Select(item => new StudentModel { id = item["id"].ToString(), name = item["name"].ToString(), address = item["address"].ToString() }); } }
- 如果已经定义了
StudentModel实体类,还可以直接用Json.NET反序列化成强类型集合,代码会更简洁:
// 先补充定义对应的实体类 public class RootObject { public List<StudentModel> elements { get; set; } } public class StudentModel { public string id { get; set; } public string name { get; set; } public string address { get; set; } // 按需添加hobbies对应的属性 public Hobbies hobbies { get; set; } } public class Hobbies { public string indoor { get; set; } public string outdoor { get; set; } } // 直接反序列化 var root = JsonConvert.DeserializeObject<RootObject>(studentJsonString); var studentList = root.elements;
内容的提问来源于stack exchange,提问作者Rohan Rao
相关产品推荐
相关产品推荐

