#set #json #set-operations #cli #command-line-tool

bin+lib jset

一个在 JSON 文件列表上执行集合操作的命令行工具

1 个不稳定版本

0.1.0 2021 年 9 月 27 日

#21 in #set-operations

MIT/Apache

20KB
457

jset

jset 是一个用于在 JSON 文件列表上执行集合操作的命令行工具

安装

待办事项

快速浏览

jset 至少需要两个 JSON 文件才能工作,但可以处理任意数量的 JSON 文件。jset 命令的基本结构如下(其中 FILE 是 JSON 文件的路径)

jset <operation> [flags] FILE FILE [...FILE]

默认情况下,所有输出都是格式化的,但可以使用 -c 标志禁用。以下所有示例都将这样做,以便于阅读。

并集

jset union 计算两个或多个 JSON 文件之间的集合并集。

对象

字段会被递归地合并在一起。

$ jset union -c <(echo '{"a":{"b": "c"}}') <(echo '{"a":{"c": "d"},"e":"f"}')
{"a":{"b":"c","c":"d"},"e":"f"}

当存在冲突的键时,较晚的文件将优先于较早的文件。

$ jset union -c <(echo '{"a":"b"}') <(echo '{"a":"c"}')
{"a":"c"}

数组

将每个数组中的元素连接在一起。

$ jset union -c <(echo '["a","b","c"]') <(echo '["d","e","f"]')
["a","b","c","d","e","f"]

在最终结果中忽略后续列表中重复的元素。

$ jset union -c <(echo '["a","b","c"]') <(echo '["b","c","d"]')
["a","b","c","d"]

原始数据(数字、布尔值、字符串、null)

如果值相同,原始数据值可以成功并集,否则将找不到并集,程序执行失败。

$ jset union -c <(echo '"a"') <(echo '"a"')
"a"
$ jset union -c <(echo '"a"') <(echo '"b"')
$ echo $?
1

交集

jset intersect 计算两个或多个 JSON 文件之间的集合交集。

对象

返回一个新对象,其中包含所有文件中存在的字段,递归地。

$ jset intersect -c <(echo '{"a":{"b":"c","g":"i"}}') <(echo '{"a":{"b":"c","g":"h"},"e":"f"}')
{"a":{"b":"c"}}

数组

只要第一个文件中的元素在所有后续文件中存在,就保留这些元素。

$ jset intersect -c <(echo '["a","b","c"]') <(echo '["a","d","e"]')
["a"]

原始数据(数字、布尔值、字符串、null)

如果值相同,原始数据值可以成功交集,否则将找不到交集,程序执行失败。

$ jset intersect -c <(echo '"a"') <(echo '"a"')
"a"
$ jset intersect -c <(echo '"a"') <(echo '"b"')
$ echo $?
1

差集

jset difference(别名:jset diff)计算两个或多个 JSON 文件之间的集合差集。这是通过迭代方式完成的,第二个文件从第一个文件中减去,第三个文件从第一个和第二个文件之间的差集中减去,依此类推。

对于四个文件的一个示例,处理方式如下

((1-2)-3)-4

# or more simply
1-2-3-4

对象

返回的对象是第一个文件减去第二个文件后的结果,递归地。后续文件中的未知字段将被忽略。

$ jset diff -c <(echo '{"a":{"b":"c","g":"i"}}') <(echo '{"a":{"b":"c","g":"h"},"e":"f"}')
{"a":{"g":"i"}}

数组

如果它们出现在任何后续文件中,将删除第一个文件中的元素。

$ jset diff -c <(echo '["a","b","c"]') <(echo '["a","d","e"]')
["b","c"]

原始数据(数字、布尔值、字符串、null)

对原始数据进行集合差集操作将返回当所有其他值都不相等时的第一个值,否则将失败。

注意:我没有使用原始数据进行集合差集的场景,所以不知道这种行为是否真的有用。🤷

$ jset diff -c <(echo '"a"') <(echo '"a"')
$ echo $?
1
$ jset diff -c <(echo '"a"') <(echo '"b"')
"a"

依赖关系

~1–1.5MB
~23K SLoC