【问题标题】:Get value from item based on another value in jshon根据 jshon 中的另一个值从项目中获取值
【发布时间】:2020-07-10 08:15:23
【问题描述】:

我有一个 JSON 对象,其结构如下:

[{"pid":0, "name":"server", "status":"online"},
{"pid":1, "name":"server2", "status":"stopped"}]

在命令行中,我想从 name 为“服务器”的项目返回 status 的值(位置不同,因此不能仅使用数组索引 0 调用)。

我不能使用jq,因为目前Node版本似乎受到了这个问题的影响:https://www.npmjs.com/advisories/1217

我目前正在尝试使用jshon,但我不知道如何链接搜索。 docs 听起来像 -p 标志应该有帮助,但在执行搜索的第一部分后,我似乎没有任何东西留在堆栈中。例如,我在尝试时收到 stack underflow 错误

pm2 jlist | jshon -a -e name -u -p -e status -u

我希望打印server online server2 stopped(无论如何这都不是我想要的——理想情况下,我只想根据server 的状态返回online)。接受任何解决方案,jshon 或其他方式。

【问题讨论】:

    标签: node.js json bash command-line jq


    【解决方案1】:

    您可以在命令行中使用,而无需任何节点纠缠:

    $ jq -r '.[] | select(.name == "server") | .status' input.json
    $ online
    

    【讨论】:

    • 啊,你是对的,谢谢!我被抛弃了,因为我在共享服务器上的 cron 作业中将它作为 bash 脚本运行,但我能够在服务器上获取 jq,所以一切都很好。奖励问题:我需要将结果保存到 bash 变量中,如果返回 null,则设置默认值(字符串“none”)。我正在尝试status=$(pm2 jlist | jq -r '.[] | select(.name == "server") | .status' :-none),但我认为默认分配在 jq 字符串之后不起作用。我该怎么做?
    • 如果您不需要区分nullfalse,那么只需使用jq的//运算符(即.... // "none")。否则你可以使用if . == null then "none" else . end
    • 谢谢,但这些似乎都不适用于空输入。尝试在此处切换“空输入”:jqplay.org/s/gqOMHiwhkj
    • 为什么要在实际输入时指定-n?如果你想覆盖输入本身是null的情况,那么你仍然可以使用相同的两种技术。
    • 是的,实际用例是在实际上没有输入的情况下;这只是展示这种行为的一种方式。这些选项似乎对我不起作用,无论是在这里还是使用实际的空输入。
    【解决方案2】:

    如果您不介意一些主要的 hackiness 和长度,您可以编写一个完整的节点脚本来为您完成。

    pm2 jlist | node -e 'tot="";process.stdin.on("data",function(d){tot+=d.toString("utf8");});process.stdin.on("end",function(){dat=JSON.parse(tot);console.log(dat.find(v => v.name == "server").status)})'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 2015-12-02
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多