【问题标题】:jq: create new json basing on existing json with usage if elsejq:基于现有的 json 创建新的 json 并使用 if else
【发布时间】:2021-06-29 10:26:21
【问题描述】:

现在我有以下问题。

有这样的输入json

{
“inn” : “qwerty”,
“cuid” : “1234”,
“type” : "legal",
“reqId” : “asdfg”
}

应该改成

{
“inn” : “qwerty”,
“reqId” : “asdfg”
}

或进入

{
“cuid” : “1234”,
“reqId” : “asdfg”
}

它取决于“类型”字段的值。我怎样才能用 JQ 做到这一点?

我的尝试都失败了,这一切都是为了尝试这种方式

.inn 作为 $inn | .cuid 作为 $cuid | {if .type == "person" then $inn else $cuid end}

但它给出了这样的结果

jq: 错误:语法错误,意外 FIELD,期待 ':'(Unix shell 引用问题?)在第 1 行: .inn 作为 $inn | .cuid 作为 $cuid | {if .type == "person" then $inn else $cuid end}
jq: 1 编译错误 退出状态 3

【问题讨论】:

  • 这看起来不像是一个有效的 JSON 对象。
  • 我已经编辑,问题是实际的

标签: json jq


【解决方案1】:

在哪里得到以下过滤器:

  • .type == "person" --> 我们使用密钥:innreqId
  • .type != "person" --> 我们使用密钥:cuidreqId

我们可以使用:

if .type == "person" then { inn } else { cuid } end + { reqId }

我所做的不同:

  • 添加了最后一部分:+ { reqId }。这里我们将reqId添加到if语句创建的对象中。

  • 我已经删除了.inn as $inn 部分,我们可以只使用密钥。

JqPlay Demo

【讨论】:

    【解决方案2】:

    您可以通过一个if then else end 表达式轻松解决您的问题:

    jq 'if .type == "person"
        then {inn, reqId}
        else {cuid, reqId}
        end' <<< '{ "inn" : "qwerty", "cuid" : "1234", "type" : "legal", "reqId" : "asdfg" }'
    
    # result
    # {
    #   "cuid": "1234",
    #   "reqId": "asdfg"
    # }
    
    jq 'if .type == "person"
        then {inn, reqId}
        else {cuid, reqId}
        end' <<< '{ "inn" : "qwerty", "cuid" : "1234", "type" : "person", "reqId" : "asdfg" }'
    
    # result
    # {
    #   "inn": "qwerty",
    #   "reqId": "asdfg"
    # }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多