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

