JsonTextReader.Read()和JObject.Load(jsonTextReader)机制

时间:2015-06-29 22:25:10

标签: c# token streamreader jsonobject reference-type

我有以下代码用于使用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()通过令牌读取流的令牌。

1 个答案:

答案 0 :(得分:1)

我不知道它具体记录在哪里,但是这个"关闭了一个"行为始终是JSON.NET在阅读中的工作方式。消耗JsonReader的各种内部函数期望它们的第一个符号已被读取并且可供检查,但是当它们完成时,它们不会在最后一个符号后读取下一个符号。它在编写递归序列化处理程序时会有所帮助:您可以看到第一个符号,然后根据传递流的方法做出决定。

在您的示例中,在调用JObject.Load之后,jsonTextReader.TokenType将是JsonToken.EndObject。