【问题标题】:Creating composite value using other fields使用其他字段创建复合值
【发布时间】:2023-01-19 18:08:47
【问题描述】:

考虑这个 json 文档

$ DATA='{ "url": "https::/abc/", "issues": { "1": { "number": 1}, "2": {"number": 2 } } }'

$ echo $DATA | jq .
{
  "url": "https::/abc/",
  "issues": {
    "1": {
      "number": 1
    },
    "2": {
      "number": 2
    }
  }
}

我正在尝试向 issues 对象添加一个名为 extra 的新字段,该对象是 .url 字段和 .number 字段的组合。

所以结果应该是这样的

{
  "url": "https::/abc/",
  "issues": {
    "1": {
      "number": 1,
      "extra": "https::/abc/1"
    },
    "2": {
      "number": 2,
      "extra": "https::/abc/2"
    }
  }

通过将 .url 字段存储在变量 ($URL) 中,我可以到达那里的一部分

$ echo $DATA | jq '.url as $URL | .issues[] += { "extra" : "\( $URL )"  } '
{
  "url": "https::/abc/",
  "issues": {
    "1": {
      "number": 1,
      "extra": "https::/abc/"
    },
    "2": {
      "number": 2,
      "extra": "https::/abc/"
    }
  }
}

问题来自于访问.number

仅在复合值中引用 .number 返回 null

$ echo $DATA | jq '.url as $URL | .issues[] += { "extra" : "\( $URL )\( .number )"  } '
{
  "url": "https::/abc/",
  "issues": {
    "1": {
      "number": 1,
      "extra": "https::/abc/null"
    },
    "2": {
      "number": 2,
      "extra": "https::/abc/null"
    }
  }
}

下一次尝试是尝试将 .number 存储在变量中,但这没有用

$ echo $DATA | jq '.url as $URL | .issues[].number as $NUM  += { "extra" : "\( $URL )\( $NUM )"  } '
jq: error: syntax error, unexpected +=, expecting '|' (Unix shell quoting issues?) at <top-level>, line 1:
.url as $URL | .issues[].number as $NUM  += { "extra" : "\( $URL )\( $NUM )"  }                                          
jq: 1 compile error

关于我所缺少的任何想法?

【问题讨论】:

    标签: jq


    【解决方案1】:

    通过使用 += 来更新您的对象,您将失去所更新内容的上下文。所以你自然无法引用当前的物品。相反,您应该改用更新分配。这样,. 就可以引用当前输入,您可以直接引用其他属性。

    .url as $URL | .issues[] |= . + { "extra" : "( $URL )( .number )"  }
    

    【讨论】:

      【解决方案2】:

      您可以为 .number 使用另一个变量,只需使用 |= 而不是 += 来保持上下文:

      .url as $url | .issues[] | .number as $num | .extra |= $url + ($num | tostring)
      

      【讨论】:

        【解决方案3】:

        .url存入一个变量,遍历到.issues[]项的层级,更新|=.extra字段。使用字符串插值"(…)"tostring@text将数字转换为字符串,以便将其添加到先前存储的url字符串中:

        . as {$url} | .issues[] |= (.extra = $url + "(.number)")
        
        {
          "url": "https::/abc/",
          "issues": {
            "1": {
              "number": 1,
              "extra": "https::/abc/1"
            },
            "2": {
              "number": 2,
              "extra": "https::/abc/2"
            }
          }
        }
        

        Demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-12
          • 1970-01-01
          • 1970-01-01
          • 2016-08-06
          • 1970-01-01
          • 1970-01-01
          • 2016-08-02
          • 1970-01-01
          相关资源
          最近更新 更多