为何NewtonSoft无法解析该JSON?报错:当前项为数组而非对象
JSON解析失败原因及解决方法
问题描述
用户提供的JSON内容经验证为合法格式:
stringstuff = "[ { \"data\": { \"user\": { \"email\": \"john@doe.com\", \"external-id\": \"47b4-af36-e9fddecdb755\" }, \"session-token\": \"BNIYdxZZew5KWnKHNZMjn8J3Q-Ii2q7Ifcs5klkginluGHhEalz-uA+C\" }, \"context\": \"/sessions\" } ]";
执行代码var jtoken = JObject.Parse(stringStuff)时抛出如下异常:
Newtonsoft.Json.JsonReaderException: Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1. at Newtonsoft.Json.Linq.JObject.Load(JsonReader reader, JsonLoadSettings settings) at Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings) at Newtonsoft.Json.Linq.JObject.Parse(String json) at TastyWorksAPI.URLGetRestValues.<Authorize>d__2.MoveNext() in C:\Users\synct\OneDrive\Documents\Projects\API\API.cs:line 61
失败原因
- 目标JSON的根节点是数组(由
[]包裹),但JObject.Parse()方法仅支持解析根节点为对象(由{}包裹)的JSON。 - 异常信息已明确指出问题:解析器预期读取对象,却读到了数组的起始标记
StartArray。
解决方法
有两种可行方案:
- 使用对应类型的解析方法:因为JSON根是数组,直接调用
JArray.Parse()解析:
var jArray = JArray.Parse(stringStuff); // 如需获取数组中的第一个对象,可执行: var jToken = jArray[0];
- 调整JSON结构(若业务允许):将根节点改为对象,在外层添加包裹结构,示例如下:
{ "items": [ { "data": { "user": { "email": "john@doe.com", "external-id": "47b4-af36-e9fddecdb755" }, "session-token": "BNIYdxZZew5KWnKHNZMjn8J3Q-Ii2q7Ifcs5klkginluGHhEalz-uA+C" }, "context": "/sessions" } ] }
调整后即可继续使用JObject.Parse()解析,之后通过jObject["items"]获取数组内容。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

