我有以下代码用于使用JsonTextReader和JObject.Load读取流:
private void ProcessStream(Stream stream)
{
stream.Position = 0;
using (StreamReader streamReader = new StreamReader(stream))
{
using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
{
while (jsonTextReader.Read())
{
if (jsonTextReader.TokenType == JsonToken.StartObject)
{
JObject jObject = JObject.Load(jsonTextReader);
/* Manipulate jObject */
}
}
}
}
}
我的问题是,是不是jsonTextReader指针向前移动了两次或更多次(导致错过令牌):一次在jsonTextReader.Read()并且在JObject.Load(jsonTextReader)中一次或多次?我无法找到解释有关JsonTextRead.Read()或JObject.Load的详细信息的文档。但是使用Resharper窥视JObject.Load(jsonTextReader)显示有多次调用jsonTextReader.Read():
public new static JObject Load(JsonReader reader)
{
...
while (reader.TokenType == JsonToken.Comment)
{
reader.Read();
}
...
JObject o = new JObject();
o.SetLineInfo(reader as IJsonLineInfo);
o.ReadTokenFrom(reader);
return o;
}
internal void ReadTokenFrom(JsonReader reader)
{
...
if (!reader.Read())
throw JsonReaderException.Create(reader, "Error reading {0} from JsonReader.".FormatWith(CultureInfo.InvariantCulture, GetType().Name));
ReadContentFrom(reader);
...
}
internal void ReadContentFrom(JsonReader r)
{
...
do{
} while (r.Read());
}
jsonTextReader是否通过值传递给JObject.Load()?如果没有,并且它是通过引用传递给Load()(通常是C#类对象的情况),那么这不等于在while循环中的jsonTextReader上多次调用Read()吗?
事实是,代码似乎有效。所以上面的解释是不正确的。我只是不确定解释的哪一部分是不正确的。有人可以解释如何使用JSonTextReader()和JObject.Load()通过令牌读取流的令牌。
答案 0 :(得分:1)
我不知道它具体记录在哪里,但是这个"关闭了一个"行为始终是JSON.NET在阅读中的工作方式。消耗JsonReader的各种内部函数期望它们的第一个符号已被读取并且可供检查,但是当它们完成时,它们不会在最后一个符号后读取下一个符号。它在编写递归序列化处理程序时会有所帮助:您可以看到第一个符号,然后根据传递流的方法做出决定。
在您的示例中,在调用JObject.Load之后,jsonTextReader.TokenType将是JsonToken.EndObject。