我有以下代码,用于使用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.Read()和JObject.Load()逐个令牌读取流。
最佳答案
我不知道它的具体记录位置,但是这种“一举一动”的行为始终是JSON.NET在阅读时的工作方式。消耗JsonReader的各种内部函数希望消耗的第一个符号已经被读取并且可以检查,但是当它们完成时,它们不会在最后一个符号之后的下一个符号中读取。它在编写递归序列化处理程序时会有所帮助:您可以看到第一个符号,然后根据该符号决定将流传递给哪种方法。
在您的示例中,在调用JObject.Load之后,jsonTextReader.TokenType将为JsonToken.EndObject。
关于c# - JsonTextReader.Read()和JObject.Load(jsonTextReader)机制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31126593/