Parsing 解析在null或[]时停止

Parsing 解析在null或[]时停止,parsing,null,jq,Parsing,Null,Jq,我有一个很好的过滤器,但是在一个新的用例中属性“p”可以为null或空数组[]之后,解析器停止计算表达式 “.p[]?.product.productId”当p为null或空数组[]时,问题就在这里 当我有这样的p属性时,它工作得很好。[{}]或[{“id”:123}] 我把过滤器分成几行,让它更容易理解 .p as $p | .p[]?.product.productId as $pa | .io[] | select(.product.productId == ($pa) or .de

我有一个很好的过滤器,但是在一个新的用例中属性“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

问候

  • E?类似于
    try E catch empty
    ,而您似乎想要的是
    try E catch null
    或者
    E?//空

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


  • p
    null
    时会发生什么?这个表达式也是错误的
    “必需的”:“($p[]| select(.product.productId==$pid)|.required)”
    它打印过滤器的文本值我忘了提到它,我留下了文本以使过滤器工作,但我也需要这个逻辑。我希望得到独立于p的过滤器工作。p有其他属性,我可以在该文本表达式上用诸如false之类的默认值替换。好吧,但是,如果p为null,该怎么办呢?如果p为null,我只想忽略它,就忽略它!非常感谢,但我没有收到任何错误,只是不工作。。。看这里。尝试在p上设置任何值,比如[{}],它就会工作。请参阅更新。在将来,如果您尝试遵循at的指导原则,这将是一个好主意-特别是,提供一个最小的示例和预期结果。
         $ jq -n '[] | .p[]?'
         jq: error (at <unknown>): Cannot index array with string "p"
         $ jq -n '[] | .p?[]'
         $
         $ jq -n '[] | .p?[]?'
         $
    
    $ jq -n '[] | try .p[] catch null'
    $