crocodile2u/json-streamer

此包最新版本(v1.0.0)没有可用的许可信息。

内存高效且快速的流式JSON解析器

v1.0.0 2019-07-01 11:34 UTC

This package is not auto-updated.

Last update: 2024-09-18 12:15:23 UTC


README

内存高效且快速的流式JSON解析器。

示例:解析包含FeatureCollection的gzipped JSON文件中的GeoJson,按特征逐个流式传输。`JsonStreamer`构造函数的第二个参数是你想要流式传输的数组在JSON结构中的路径。在这个例子中,GeoJson的`FeatureCollection`是一个具有特征对象数组的`features`属性的object。

$fp = fopen("compress.zlib://" . __DIR__ . "/Fiji.GeoJson.gz", "r");
$parser = new \JsonStreamer\JsonStreamer($fp, "features");
foreach ($parser as $val) {
    echo substr(json_encode($val), 0, 100)."\n\n";
}

你想要流式传输的数组可以深嵌在JSON结构中。在这里,我们感兴趣的数据位于第3级。如果你要在JavaScript中访问此数组,那将类似于以下内容

let container = {
    "lvl1": {
        "lvl2": {
            "lvl3": [
                [1, 2, 3],
                [1, 2, 3, 4],
                [1, 2, 3, 4, 5],
                [1, 2, 3, 4, 5, 6]
            ]
        }
    }
}
let data = container.lvl1.lvl2.lvl3

使用`JsonStreamer`在PHP中遍历相同的数据,请执行以下操作

$fp = fopen('data://text/plain,' . $json,'r');
$parser = new \JsonStreamer\JsonStreamer($fp, "lvl1.lvl2.lvl3");
foreach ($parser as $val) {
    echo json_encode($val) . "\n\n";
}

`JsonStreamer`是针对GeoJson构建的,并且只能遍历JSON数组(可能嵌套在包装对象内部)。但是,与其他流式JSON解析器相比,它的效率相当高。我能够以比任何其他流式JSON解析器都快十倍的速度解析包含巨大GeoJson形状(多边形)的GeoJson文件,并且使用大约少4倍的内存。我这样说,没有任何贬低那些项目的意图:它们是通用的JSON解析器,而`JsonStreamer`只做非常特定的一种工作。