jsonfilter 和 jshn.sh

发布时间 2023-04-19 23:22:55作者: lsgxeva

jsonfilter 和 jshn.sh

来源 https://blog.csdn.net/weixin_39637151/article/details/110610608

 

OpenWRT下自带了两个处理JSON文件的工具。

  • 工具一:/usr/bin/jsonfilter

运行/usr/bin/jsonfilter 得到如下提示:

/usr/bin/jsonfilter 命令行参数

-a:将输入当数组处理。

-i:指定一个操作的json文件。

-s:指定一段json字符串。

-l:限定输出的最大数量。当输出结果很多时,可以使用这个参数来限定输出数量。

-F:指定特定的分隔符。当使用了非标准分隔符时,可以用该参数指定。

-t:后面跟随key名,结果显示匹配的key的类型

-e:后面跟随key名,结果显示json文件/串里的匹配串的值

关于搜索的pattern,help中提示,该工具实现了:

$, @, [], * 和,

以及常用的表达式等。

由于需要一个完整的javascript引擎来支持,而OpenWRT中没有该引擎,所以它未实现递归的子搜索操作符“..”和过滤表达式'?()'、'()'。

例子:

显示LAN上的第一个IPv4地址:

# ifstatus lan | jsonfilter -e '@["ipv4-address"][0].address'

结果:192.168.1.1 (注:此处结果跟各个具体路由器设置有关)

工具二:/usr/share/libubox/jshn.sh

该工具必须在其他脚本中以source命令引用来使用,它实现了33个函数:

用于解析、生成json的函数22个:

_json_get_var()

_json_set_var()

__jshn_raw_append()

_jshn_append()

_get_var()

_set_var()

_json_inc() {

_json_add_generic()

_json_add_table()

_json_close_table()

json_set_namespace()

json_cleanup()

json_init()

json_add_object()

json_close_object()

json_add_array()

json_close_array()

json_add_string()

json_add_int()

json_add_boolean()

json_add_double()

json_add_null()

用于读取、访问json变量的函数11个:

json_load()

json_load_file()

json_dump()

json_get_type()

json_get_keys()

json_get_values()

json_get_var()

json_get_vars()

json_select()

json_is_a()

json_for_each_item()

 

jshn.sh用法解析

https://blog.csdn.net/fjlhlonng/article/details/120200364

一、示例用到的json数据

{
        "up": true,
        "uptime": 18804,
        "l3_device": "eth0.2",
        "proto": "dhcp",
        "device": "eth0.2",
        "ipv4-address": [
                {
                        "address": "192.168.5.102",
                        "mask": 24
                },
                {
                        "address": "192.168.5.103",
                        "mask": 24
                }
        ],
        "dns-server": [
                "1.1.1.1",
                "2.2.2.2",
                "223.6.6.6",
                "223.5.5.5"
        ]
}

上面的数据可以用下面的代码生成并查看:

json_init;
json_add_boolean 'up' 1;
json_add_int 'uptime' 18804;
json_add_string 'l3_device' 'eth0.2';
json_add_string 'proto' 'dhcp';
json_add_string 'device' 'eth0.2';
json_add_array 'ipv4_address';
json_add_object '0';
json_add_string 'address' '192.168.5.102';
json_add_int 'mask' 24;
json_close_object;
json_add_object '1';
json_add_string 'address' '192.168.5.103';
json_add_int 'mask' 24;
json_close_object;
json_close_array;
json_add_array 'dns_server';
json_add_string '0' '1.1.1.1';
json_add_string '1' '2.2.2.2';
json_add_string '2' '223.6.6.6';
json_add_string '3' '223.5.5.5';
json_close_array;
json_dump;

二、jshn.sh中包含的函数

1)json_load以及json_load_file

这两个函数都只有一个参数,前者是一个json字符串,后者是一个文件。

2)json_dump

该函数用于展示通过json_load或者json_load_file加载的数据

3)json_get_type

该函数用于获取对象的数据类型

4)json_get_keys

该函数用于获取对象(当前级别)的所有键

5)json_get_values

该函数用户获取对象的(当前级别)的所有值

6)json_get_var

该函数用于获取指定对象(key)的值

7)json_get_vars

该函数用于获取多个(key)值,它的参数有两种

  • 第一种:直接用json文件中的key来获取对应的值,key可以有多个

  • 第二种:当字段不存在时,返回一个预设定的值

8)json_select

该函数可以用于选择对象或者返回上一级(或者最外层的对象)

9)json_is_a

用于判断类型

10)json_for_each_item

该函数用于遍历json中的对象或者数组

 

======== End