【问题标题】:Parsing stops on null or []解析在 null 或 [] 处停止
【发布时间】:2021-02-24 10:55:47
【问题描述】:

我的这个过滤器运行良好,但是在属性“p”可以为 null 或空数组 [] 的新用例之后,解析器停止计算表达式。

".p[]?.product.productId" 问题出在此处,当 p 为 null 或空数组 [] 时。

当我拥有这样的 p 属性时,它运行良好。 [{}] 或 [{"id":123}]

为了便于理解,我将过滤器分成几行。

.p as $p 
| .p[]?.product.productId as $pa 
| .io[] 
| select(.product.productId == ($pa) or .description == "product description x") 
|  .product.productId as $pid 
|  {"offerId": .offerId, 
    "description": .description, 
    "required": 
       "($p[] | select(.product.productId == $pid) | .required)", 
    "applied": false, 
    "amount": (if .prices | length == 0 
       then 0 
       elif .prices[0].amount != null 
       then .prices[0].amount 
       else .prices[0].amountPercentage 
       end)}

输入:

{
   "p": null,
   "io": [{
     "offerId": 5593,
     "description": "product description x",
     "product": {
        "productId": 393,
        "description": "product description x 2",
        "type": "Insurance"
     },
     "prices": [
        {
           "amount": null,
           "amountPercentage": 4.13999987,
           "status": "On"
        }
     ]
  }]
}

我想要的只是当 P 为 null 或 [] 时能够忽略它。

*我知道这个文字表达式“($p[] | select(.product.productId == $pid) | .required)”

jqplay.org/s/wYwKUFM2XR

问候

【问题讨论】:

  • pnull 时会发生什么?
  • 这个表达式也是错误的"required": "($p[] | select(.product.productId == $pid) | .required)" 它打印过滤器的文字值
  • 我忘了提及它,我留下了文字以使过滤器工作,但我也需要这个逻辑。我期望过滤器独立于 p 工作。 p 具有其他属性,我可以在该文字表达式上用默认值(如 false)替换它们。
  • 好的,但是,如果p 为空,应该怎么办?
  • 如果P为null,我只想忽略它!

标签: parsing null jq


【解决方案1】:
  1. E?就像try E catch empty,而您似乎想要的是try E catch nullE? // null

  2. .p[]?.p?[] 或 .p?[]? 不同:

     $ jq -n '[] | .p[]?'
     jq: error (at <unknown>): Cannot index array with string "p"
     $ jq -n '[] | .p?[]'
     $
     $ jq -n '[] | .p?[]?'
     $

具体来说,.p[] 就像.p | (try .[] catch empty),所以没有什么可以阻止.p 引发异常。

您可能想考虑明确使用try

$ jq -n '[] | try .p[] catch null'
$

【讨论】:

  • 非常感谢,但我没有收到任何错误,只是不起作用...看看这里jqplay.org/s/wYwKUFM2XR。尝试在 p 上设置任何值,例如 [{}],它可以工作。
  • 查看更新。将来,如果您尝试遵循 minimal reproducible example 的指导方针,这将是一个好主意 - 特别是提供一个最小示例和预期结果。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多