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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 05:06:05