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

调用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()
        });
}

额外优化建议

  1. 尽量别用.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()
            });
    }
}
  1. 如果已经定义了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:57:36