我正在尝试以增量方式利用 Twitter 流 API 逐个处理根对象,并通过回调异步返回每个根对象。我已经看到实现计算 { vs } 的数量并等待数字在 0 处平衡然后处理该块数据,尽管对我来说这真的感觉不安全。
我的计划是利用 json.net JsonTextReader并使用TokenType和Depth来完成这项工作。这运行良好,因为它是在每个对象末尾拆分读取的非常可靠的方法,我只是无法弄清楚如何将该数据放入反序列化方法。反序列化方法确实接受 JsonTextReader 作为参数,但它从那一点开始处理(毕竟它是一个只向前的流),所以我被卡住了。还有一个 反序列化对象异步方法可用,但只接受字符串。
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!]));
}
}
}
}
我希望我只是因为盯着特定应用程序太久而错过了一些明显的东西。
实际上,您可以传递部分使用的 JsonTextReader 进行反序列化,而不是自己处理深度,这不会比结束标记更进一步读取:
while (jsonReader.Read())
{
if (jsonReader.TokenType == JsonToken.StartObject)
{
newTweetCallback(jsonSerializer.Deserialize<Tweet>(jsonReader));
// Debug.Assert(jsonReader.TokenType == JsonToken.EndObject);
}
}
因此,没有必要自己提前阅读。