从 JsonWriter (NewtonSoft.Json 13.0.1) 获取错误 "No token to close. Path ''."
Getting an error "No token to close. Path ''." from 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 ''.
我做错了什么?我无法通过 Google.
找到答案
TL;DR:问题是您试图关闭该对象两次:
writer.WriteEnd();
writer.WriteEndObject();
删除其中一行以解决问题。你不需要两者。
更详细的解释:
对 WriteStartObject
和 WriteStartArray
的调用必须与对 WriteEndObject
和 WriteEndArray
的相应调用相平衡。
WriteEnd
是一种关闭最后一个标记的便捷方法,无论它是什么类型。所以它的功能与 WriteEndObject
和 WriteEndArray
相同。
在您的代码中,您在方法的开头调用了一次 WriteStartObject
,但随后调用了 both WriteEnd
和 WriteEndObject
以结束它。其中第一个关闭您启动的对象;第二个抛出异常,因为没有要关闭的东西——你已经关闭了它。
以下代码示例:
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 ''.
我做错了什么?我无法通过 Google.
找到答案TL;DR:问题是您试图关闭该对象两次:
writer.WriteEnd();
writer.WriteEndObject();
删除其中一行以解决问题。你不需要两者。
更详细的解释:
对 WriteStartObject
和 WriteStartArray
的调用必须与对 WriteEndObject
和 WriteEndArray
的相应调用相平衡。
WriteEnd
是一种关闭最后一个标记的便捷方法,无论它是什么类型。所以它的功能与 WriteEndObject
和 WriteEndArray
相同。
在您的代码中,您在方法的开头调用了一次 WriteStartObject
,但随后调用了 both WriteEnd
和 WriteEndObject
以结束它。其中第一个关闭您启动的对象;第二个抛出异常,因为没有要关闭的东西——你已经关闭了它。