inkrot / php-compress-json
以高效的方式存储JSON数据
v0.1.1
2023-03-21 17:19 UTC
Requires
- php: ^8.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpstan/phpstan-strict-rules: ^1.5
- phpunit/phpunit: ^8.1
README
这是一个PHP库,用于压缩具有重复结构和值的大型JSON文档。它有助于在保持文档结构和键名的同时,减少JSON文件的大小,例如在存储或通过网络传输时。
受到compress-json的启发。感谢@beenotung。
此库与compress-json(NodeJS的同一库)完全兼容。
功能
- 支持所有JSON类型
- 保留对象键顺序
- 重复值只存储一次
- 数字以base62格式编码(0-9A-Za-z)
- 为存储和压缩大量数据时的缓存提供自定义内存提供程序(请参阅类AbstractMemory)。您可以通过
Compressor::createWithMemory()
方法传递自定义内存提供程序。 - 在
toJson
或decompressJson
方法中分别传递自定义的json_encode
或json_decode
参数
安装
通过Composer
composer require inkrot/php-compress-json
使用方法
压缩
use CompressJson\Core\Compressor; $data = [ 'key1' => 'value1', 'key2' => 'value3', 'key3' => [ 'nestedKey1' => 'value1' ] ]; $compressedJson = Compressor::create() ->compress($data) ->toJson(); print_r($compressedJson); // encoded string in JSON format
输出
[["key1","key2","key3","a|0|1|2","value1","value3","nestedKey1","a|6","o|7|4","o|3|4|5|8"],"9"]
解压缩
use CompressJson\Core\Compressor; $compressedJson = '[["key1","key2","key3","a|0|1|2","value1","value3","nestedKey1","a|6","o|7|4","o|3|4|5|8"],"9"]'; $data = Compressor::create() ->decompressJson($compressedJson); print_r($data); // array
输出
Array
(
[key1] => value1
[key2] => value3
[key3] => Array
(
[nestedKey1] => value1
)
)
高效压缩的示例结构
use CompressJson\Core\Compressor; $data = [ 'count' => 3, 'names' => ['New York', 'London', 'Paris', 'Beijing', 'Moscow'], 'cities' => [ [ 'id' => 1, 'name' => 'New York', 'countryName' => 'USA', 'location' => [ 'latitude' => 40.714606, 'longitude' => -74.002800, ], 'localityType' => 'BIG_CITY', ], [ 'id' => 2, 'name' => 'London', 'countryName' => 'UK', 'location' => [ 'latitude' => 51.507351, 'longitude' => -0.127696, ], 'localityType' => 'COUNTRY_CAPITAL', ], [ 'id' => 3, 'name' => 'Paris', 'countryName' => 'France', 'location' => [ 'latitude' => 48.856663, 'longitude' => 2.351556, ], 'localityType' => 'COUNTRY_CAPITAL', ], [ 'id' => 4, 'name' => 'Beijing', 'countryName' => 'China', 'location' => [ 'latitude' => 39.901850, 'longitude' => 116.391441, ], 'localityType' => 'COUNTRY_CAPITAL', ], [ 'id' => 5, 'name' => 'Moscow', 'countryName' => 'Russia', 'location' => [ 'latitude' => 55.755864, 'longitude' => 37.617698, ], 'localityType' => 'COUNTRY_CAPITAL', ], ] ]; $compressedJson = Compressor::create() ->compress($data) ->toJson(); print_r(json_encode($data)); echo PHP_EOL; print_r($compressedJson);
纯JSON(749个字符)
{"count":3,"names":["New York","London","Paris","Beijing","Moscow"],"cities":[{"id":1,"name":"New York","countryName":"USA","location":{"latitude":40.714606,"longitude"
:-74.0028},"localityType":"BIG_CITY"},{"id":2,"name":"London","countryName":"UK","location":{"latitude":51.507351,"longitude":-0.127696},"localityType":"COUNTRY_CAPITAL
"},{"id":3,"name":"Paris","countryName":"France","location":{"latitude":48.856663,"longitude":2.351556},"localityType":"COUNTRY_CAPITAL"},{"id":4,"name":"Beijing","coun
tryName":"China","location":{"latitude":39.90185,"longitude":116.391441},"localityType":"COUNTRY_CAPITAL"},{"id":5,"name":"Moscow","countryName":"Russia","location":{"l
atitude":55.755864,"longitude":37.617698},"localityType":"COUNTRY_CAPITAL"}]}
压缩JSON(562个字符)
[["count","names","cities","a|0|1|2","n|3","New York","London","Paris","Beijing","Moscow","a|5|6|7|8|9","id","name","countryName","location","localityType","a|B|C|D|E|F
","n|1","USA","latitude","longitude","a|J|K","n|e.2Xkv","n|-1C.28G","o|L|M|N","BIG_CITY","o|G|H|5|I|O|P","n|2","UK","n|p.dz7","n|-0.2vFR","o|L|T|U","COUNTRY_CAPITAL","o
|G|R|6|S|V|W","France","n|m.1XNq","n|2.2kQz","o|L|Z|a","o|G|4|7|Y|b|W","n|4","China","n|d.F7F","n|1s.bVh","o|L|f|g","o|G|d|8|e|h|W","n|5","Russia","n|t.1xtN","n|b.3lHA"
,"o|L|l|m","o|G|j|9|k|n|W","a|Q|X|c|i|o","o|3|4|A|p"],"q"]
在此示例中,压缩给出了25%的效率。然而,结构越复杂和重复,压缩效率就越高。
测试
composer test
鸣谢
许可证
BSD 2-Clause License(免费开源软件)