Я следующий код для чтения потока с помощью JsonTextReader и JObject.Load:JsonTextReader.Read() и JObject.Load (jsonTextReader) механизм
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. Но заглядывая в JObject.Load (jsonTextReader) с помощью Resharper показывает, что несколько раз, когда 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#), разве это не эквивалентно тому, что Read() вызывается несколько раз на jsonTextReader внутри цикла while?
Дело в том, что код работает. Поэтому приведенное выше объяснение неверно. Я просто не знаю, какая часть объяснений неверна. Может кто-нибудь объяснить, как поток считывается токеном с помощью токена, используя JSonTextReader.Read() и JObject.Load().