<div dir="ltr">I'm trying to work with the jsonfilter program included in the jsonpath project from Jo-Philipp (<a href="https://git.openwrt.org/?p=project/jsonpath.git;a=summary">https://git.openwrt.org/?p=project/jsonpath.gi</a>t)<div><div><br></div><div>Perhaps this is a failure on my part to understand the documentation provided by this referenced webpage: <a href="http://goessner.net/articles/JsonPath/">http://goessner.net/articles/JsonPath/</a></div><div><br></div><div>I'm trying to filter out parts of a json string while still retaining some structured identifying information.</div><div><br></div><div>For example, lets say, hypothetically, I had some JSON string containing an array of objects, and I want only two key / value pairs to be returned.</div><div><br></div><div>Let's use the result of "ubus call network.interface dump" as the example:</div><div><br></div><div>This shell script</div><div>> ubus call network.interface dump | jsonfilter -e '@.interface' | jsonfilter -e '@[@.up=true].interface'<br></div><div><br></div><div>Will return the following, on my OpenWRT system:</div><div>lan<br>loopback<br>wan<br>wan6<br>wwan<br></div></div><div><br></div><div>What I want to do is return a JSON string with this representation:</div><div>[</div><div>    { "interface" : "lan", "uptime" : 11111 },</div><div>    ...</div><div>]</div><div><br></div><div>E.g., I want to filter the json not down to a single value, but to a collection of key-value pairs by excluding items that don't match.</div><div><br></div><div><br></div><div>So, based on the documentation that I've read, the expression might look something like this:</div><div><br></div><div>> ubus call network.interface dump | jsonfilter -e '@.interface' | jsonfilter -e '@[@.up=true].[interface, uptime]'<br></div><div><br></div><div>Of course, that syntax does not work, and so far the only use of the union operator in jsonfilter is like this expression, which returns all interfaces (e.g. either up OR not up)</div><div><br></div><div>> ubus call network.interface dump | jsonfilter -e '@.interface' | jsonfilter -e '@[@.up=true, @.up=false].interface'</div><div><br></div><div>I can't find any examples (beyond one or two very simplistic examples) of how to use the jsonfilter program on stackoverflow, nor the OpenWRT mailing list, nor the OpenWRT Discourse</div><div><br></div><div>I'm quite reluctant to do multiple processing sweeps. E.g. the following (probably syntax-error-full, and erroneous output) shell script is extremely unattractive<br></div><div><br></div><div>json=`ubus call network.interface dump | jsonfilter -e '@.interface'`</div><div>echo '['</div><div>for itf in $(echo $json  | jsonfilter -e '@[@.up=true].interface')<br></div><div>do</div><div>    echo "{ \"interface\" : \"$itf\" , \"uptime\" : $(echo $json  | jsonfilter -e "@[@.interface=$itf].uptime") }," # Oh look, an unconditional trailing comma... that won't parse until JSON5...</div><div>done</div><div>echo ']'</div><div><br></div><div>Of course, the json string that I'm trying to manipulate is not coming from "ubus call network.interface dump", it's from a third party program that can't be modified, I'm only using the ubus JSON as an example to illustrate the general concept of what I'm asking for.</div><div><br></div><div><div><br></div><div>Is this something that jsonfilter is capable of doing at all? Or am I having a fundamental misunderstanding of the program's capabilities?</div></div><div><br></div></div>