3

我正在尝试以增量方式使用 Twitter 流 API 来逐个处理根对象,并通过异步回调返回每个对象。我已经看到实现计算 { vs } 的数量并等待数字在 0 处平衡,然后处理该数据块,尽管对我来说这真的感觉不安全。

我的计划是使用 json.net JsonTextReader 并使用 TokenType 和 Depth 来完成这项工作。这很好,因为它是在每个对象的末尾拆分读取的一种非常可靠的方法,我只是不知道如何将该数据放入 Deserialize 方法中。Deserialize 方法确实接受 JsonTextReader 作为参数,但是从那时起处理(毕竟它是一个仅向前的流)所以我被卡住了。还有一个 DeserializeObjectAsync 方法可用,但只接受一个字符串。

var jsonSerializer = new JsonSerializer();
using (StreamReader reader = new StreamReader(_response.GetResponseStream()))
{
    using (var jsonReader = new JsonTextReader(reader))
    {
        while (jsonReader.Read())
        {
            if (jsonReader.Depth == 0 && jsonReader.TokenType == JsonToken.EndObject)
            {

                //newTweetCallback(jsonSerializer.Deserialize<Tweet>([Some magic here. Help!]));
            }
        }
    }
}

我希望我只是因为盯着特定应用程序太久而遗漏了一些明显的东西。

4

1 回答 1

2

实际上,您可以将部分使用的 JsonTextReader 传递给 Deserialize,而不是自己处理深度,这将不会比结束标记进一步读取:

while (jsonReader.Read())
{
    if (jsonReader.TokenType == JsonToken.StartObject)
    {
        newTweetCallback(jsonSerializer.Deserialize<Tweet>(jsonReader));
        // Debug.Assert(jsonReader.TokenType == JsonToken.EndObject);
    }
}

所以没有必要自己提前阅读。

于 2014-03-31T17:50:17.360 回答