C#中NewtonSoft.Json 13.0.1 JsonWriter报错"No token to close. Path ''."
问题核心原因
代码中多调用了一次冗余的WriteEnd()方法,打乱了JsonWriter内部跟踪的待闭合令牌栈状态。
Newtonsoft.Json 的 JsonWriter 会在内部维护一个结构状态栈:每次调用 WriteStartObject()、WriteStartArray() 这类开启嵌套结构的方法时,都会向栈中压入一个对应的待闭合节点。所有闭合操作必须和之前的开启操作严格一一对应,多一次、少一次都会直接触发状态校验报错。
你的代码里整个JSON结构只通过 WriteStartObject() 压入了1个待闭合的对象节点,按正常流程写完所有属性值后,仅需要一次闭合操作就能完成结构。但你在写完最后一个grant_type属性值后多写了一行 writer.WriteEnd();:
- 第一次调用这个通用闭合方法时,会直接弹出栈里唯一的待闭合对象节点,完成整个JSON对象的闭合,此时内部状态栈已经完全清空
- 紧接着你再调用
writer.WriteEndObject()时,栈里已经没有任何可以闭合的节点,因此直接抛出No token to close. Path ''错误——因为此时栈已空,不存在可以计算路径的节点上下文,所以提示Path为空。
修正方案
直接移除那行多余的writer.WriteEnd();即可,修正后的核心代码如下:
using (JsonWriter writer = new JsonTextWriter(sw)) { writer.Formatting = Formatting.Indented; writer.WriteStartObject(); writer.WritePropertyName("client_id"); writer.WriteValue(_clientID); writer.WritePropertyName("client_secret"); writer.WriteValue(_clientSecret); writer.WritePropertyName("audience"); writer.WriteValue(_audience); writer.WritePropertyName("grant_type"); writer.WriteValue(_grantType); writer.WriteEndObject(); } Console.WriteLine(sw.ToString());
补充说明:
WriteEnd()是通用闭合方法,会自动识别栈顶的令牌类型(无论对象还是数组)完成闭合,不需要和单独的WriteEndObject()强制搭配使用。日常使用中只要保证「开启的结构节点总数 = 所有闭合操作的总次数」,就不会触发这类栈不平衡的报错。
内容的提问来源于stack exchange,提问作者user7806247
相关产品推荐
相关产品推荐

