我有以下代码,用于使用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/

10-09 20:50