c# - 收到错误“没有要关闭的令牌。路径''。” 来自 JsonWriter (NewtonSoft.Json 13.0.1)
问题描述
以下代码示例:
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.WriteEnd();
writer.WriteEndObject();
}
Console.WriteLine(sw.ToString());
消息失败No token to close. Path ''.
我究竟做错了什么?我无法通过谷歌找到答案。
解决方案
TL;DR:问题是您试图关闭对象两次:
writer.WriteEnd();
writer.WriteEndObject();
删除这些行之一以解决问题。你不需要两者。
更详细的解释:
WriteStartObject
对and的调用WriteStartArray
必须与对WriteEndObject
and的对应调用相平衡WriteEndArray
。
WriteEnd
是关闭最后一个令牌的便捷方法,无论它碰巧是什么类型。WriteEndObject
所以它的功能与和相同WriteEndArray
。
在您的代码中,您WriteStartObject
在方法的开头调用一次,然后您同时 WriteEnd
调用并WriteEndObject
结束它。其中第一个关闭您启动的对象;第二个抛出异常,因为没有什么可以关闭的——你已经关闭了它。
推荐阅读
- date - 按年份部分显示保存在 CoreData 中的日期
- laravel - 如何将编码放在这个刀片文件顶部?
- javascript - 是否可以检测到 v-on:change 事件是否已被特定方法调用
- html - 即使我按下了为该功能分配的按钮,ajax 也无法正常工作
- postgresql - PSQL - 按两个单独字段的间隔过滤的查询性能
- scala - 如何通过比较scala中配置的映射列表值来检索键
- javascript - 未捕获的错误:未捕获(承诺中):TypeError:this.xxxService.getSomething(...).toPromise 不是函数
- java - 无法使用 selenium webdriver 启动 chrome 浏览器
- angular - ag-grid 中的自定义过滤器在 Angular 10 应用程序中不起作用
- python - “GET”请求在 Python 中工作,但在机器人框架中不起作用