C# “获取错误”;没有可关闭的令牌。路径''&引用;来自JsonWriter(NewtonSoft.Json 13.0.1)

C# “获取错误”;没有可关闭的令牌。路径''&引用;来自JsonWriter(NewtonSoft.Json 13.0.1),c#,json.net,C#,Json.net,以下代码示例: using (JsonWriter writer = new JsonTextWriter(sw)) { writer.Formatting = Formatting.Indented; writer.WriteStartObject(); writer.WritePropertyName("client_id"); writer.WriteValue(_clientID); writer.WriteProp

以下代码示例:

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());
失败,消息
没有要关闭的令牌。路径“”。


我做错了什么?我无法通过谷歌找到答案;DR:问题是您试图关闭对象两次:

writer.WriteEnd();
writer.WriteEndObject();
请删除其中一行以修复此问题。你不需要两者兼而有之


更详细的解释:

WriteStartObject
writeStarray
的调用必须与对
WriteEndObject
WriteEndArray
的相应调用相平衡

WriteEnd
是一种方便的方法,可以关闭最后一个令牌,不管它是什么类型。因此,它的功能与
WriteEndObject
WriteEndArray
相同


在代码中,在方法的开头调用一次
WriteStartObject
,然后调用
WriteEnd
WriteEndObject
来结束它。第一个关闭您启动的对象;第二个抛出异常,因为没有要关闭的内容——您已经关闭了它。

谢谢您的详细回答!请问,您是否建议我坚持使用NewtonSoft或.net5 system.text.json?这完全取决于您的情况。你有理由改变吗?Newtonsoft目前比System.Text.Json具有更多的功能,并且存在的时间更长。System.Json.Text与Newtonsoft有不同的目标。具体来说,它旨在通过支持
Span
实现更高的吞吐量,并且在解析方面更加严格。那有关系吗?我不知道。你需要做自己的研究并做出决定。如果没有很好的理由改变,坚持你现有的。