异步流式传输在线json信息



我正在尝试制作一个程序,该程序使用数据来寻找大型3D数学网络的解决方案。在JSON格式中,有一组节点和关于它们在3D空间中的位置以及它们有什么属性等信息。您可以请求两种格式:

标准JSON数组:https://www.example.com/nodes.json

[{"ID": 1, "Type": "Node", "x": 0, "y": 0, "z": 0}, {"ID": 2, "Type": "OtherNode", "x": 1, "y": 0, "z": 0}, ...

行分隔数组:https://www.example.com/nodes.jsonl

{"ID": 1, "Type": "Node", "x": 0, "y": 0, "z": 0}
{"ID": 2, "Type": "OtherNode", "x": 1, "y": 0, "z": 0}
...

我的班级:

class Node
{
ulong ID { get; set; }
nodeType Type { get; set; }
decimal X { get; set; }
decimal Y { get; set; }
decimal Z { get; set; }
}

这些节点集合可能会变得非常大。GB可能很大,但谢天谢地,每天只需要更新一次。问题是,如果我让它下载JSON异步,那么在下载完整个程序之前,该程序仍然不可用。

WebClient.DownloadFile(settings.URL, path);
List<Node> nodes = JsonConvert.DeserializeObject<List<Node>>(path);

然而,如果我有最初的几个节点,我仍然可以在没有整个节点集的情况下开始求解网络。如果我可以使用某种流一次下载一个字符的文件,我可以绕过它

SomeStream someStream = new SomeStream(URL);
while(!someStream.eof)
{
string jsonString = someStream.ReadLine();
nodes.Add(JsonConvert.DeserializeObject<Node>(jsonString));
}

我担心,除非网站支持一行一行地请求数据,否则这可能是不可能的。如果有其他方法可以解决这个问题,我仍然愿意学习。

据我所知,没有json解析器IAsyncEnumerbale去相关器

然而,只要您不处理流,我们就应该能够使用常规迭代器来实现这一点

public static IEnumerable<Node> ReadStream(Stream stream)
{
var serializer = new JsonSerializer();
using var reader = new StreamReader(stream);
using var jsonReader = new JsonTextReader(reader) {SupportMultipleContent = true};
while (jsonReader.Read())
yield return serializer.Deserialize<Node>(jsonReader);
}

示例

var httpclient = new HttpClient(); // dont do this, just an example
// note don't dispose the stream until its finished enumerating, or your will regret it
var stream = await httpclient.GetStreamAsync("https://www.example.com/nodes.json");
foreach (var item in ReadStream(stream))
Console.WriteLine(item.ID);

注意:这是完全未经测试的,因为我没有一个url可以给我连续的json提要,而不需要花时间写一个

最新更新