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

JsonConvert反序列化报错:Current JsonReader item is not an object: StartArray

解决JsonConvert.DeserializeObject反序列化JSON数组为单个对象时的JObject.Load错误

错误现象

调用JsonConvert.DeserializeObject时触发错误,错误发生在JObject.Load(reader)处,错误信息:

'Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.'

相关代码片段

JSON响应内容

var responseData = "[{\"Channels\":[{\"Channel\":55,\"DataRate\":60,...}]}]";

反序列化代码

ReferenceStationData jsonLatestData = JsonConvert.DeserializeObject<ReferenceStationData>(responseData, new JsonSerializerSettings{DateTimeZoneHandling = DateTimeZoneHandling.Utc});

自定义JsonConverter的ReadJson方法

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JObject jo = JObject.Load(reader);
    // 其余属性映射逻辑
}

问题原因

返回的JSON是数组结构(最外层由[]包裹),但代码尝试将其反序列化为单个ReferenceStationData对象;同时自定义转换器使用JObject.Load(reader)读取数据,而JObject.Load仅能处理JSON对象(由{}包裹的结构),无法识别JSON数组,因此触发报错。

解决方案

方案1:直接反序列化为数组/列表

如果接口返回的确实是多个ReferenceStationData对象的集合,直接将反序列化目标类型改为数组或List<ReferenceStationData>:

List<ReferenceStationData> jsonLatestData = JsonConvert.DeserializeObject<List<ReferenceStationData>>(responseData, new JsonSerializerSettings{DateTimeZoneHandling = DateTimeZoneHandling.Utc});
// 若仅需第一个元素,可直接取索引0
ReferenceStationData firstItem = jsonLatestData[0];

方案2:修改自定义JsonConverter支持数组输入

如果业务逻辑要求必须反序列化为单个对象(比如接口返回的数组永远只包含一个元素),可修改自定义转换器的ReadJson方法,先判断读取器的Token类型,若为数组则取第一个元素再转为JObject:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JToken token = JToken.Load(reader);
    // 若为数组,取第一个元素作为目标对象
    if (token.Type == JTokenType.Array)
    {
        token = token.FirstOrDefault();
    }
    if (token?.Type == JTokenType.Object)
    {
        JObject jo = (JObject)token;
        // 执行原有的属性映射逻辑
        ReferenceStationData data = new ReferenceStationData();
        // 示例映射:Channels属性
        data.Channels = jo["Channels"].ToObject<List<ChannelData>>(serializer);
        // 其他属性映射逻辑...
        return data;
    }
    // 处理空或非预期结构的情况
    return existingValue ?? Activator.CreateInstance(objectType);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:40:09