我正在try Select 1个价格,如果它存在,否则我想 Select 一个始终存在的"默认"价格.如果RMP价格不存在,我的JQ会工作,我只会拿回1的值.但正如你所看到的,如果RMP存在,我最终会得到2个条目...每种价格都有一个.我只想找一个结果回来.它要么具有RMP价格(如果存在),要么具有RET价格.不知道我到底做错了什么.

杰森

[
  {
    "PartNumber": "ABC123",
    "Prices": {
      "Pricing": [
        {
          "@PriceType": "RET",
          "Price": {
            "#text": "230.3800"
          }
        },
        {
          "@PriceType": "LST",
          "Price": {
            "#text": "230.3800"
          }
        },
        {
          "@PriceType": "RMP",
          "Price": {
            "#text": "152.0000"
          }
        }
      ]
    }
  }
]

JQ

[.[] | {
    sku: .PartNumber,
    price: (.Prices?.Pricing? | if type == "array" then .[] else . end | if any(.; ."@PriceType" == "RMP") then select(."@PriceType"? == "RMP").Price."#text" else select(."@PriceType"? == "RET").Price."#text" end),
}]

结果

[
  {
    "sku": "ABC123",
    "price": "230.3800"
  },
  {
    "sku": "ABC123",
    "price": "152.0000"
  }
]

推荐答案

你的方法的"问题"是if type == "array" then .[] else . end.因为.Prices.Pricing确实是一个数组,所以它分支到.[],分解数组,所以下面的代码执行三次,每一项一次.第一个将生成缺省项(因为没有其他项),第二个不输出任何内容(既不存在目标也不存在缺省项),第三个立即找到目标项.

我的方法是使用INDEX将数组转换为对象,并使用替换运算符//在前面返回NULL的情况下 Select 默认值:

map({
  sku: .PartNumber,
  price: (.Prices.Pricing | INDEX(."@PriceType") | .RMP // .RET | .Price."#text")
})
[
  {
    "sku": "ABC123",
    "price": "152.0000"
  }
]

Demo

Json相关问答推荐

如何在PowerShell中访问嵌套的JSON字段

通过在织女星简化图上裁剪来显示文本

无法从JSON解析ZonedDateTime,但可以使用格式化程序很好地解析

给定一个包含两个数组的JSON输入文件,如何使用Jolt将一个数组中的每个元素与另一个数组组合在一起?

褐煤面积图中的分选问题

(Kotlin)com.google.gson.internal.LinkedTreeMap无法转换为com.example.phonetest2.model.HallData

如何对未知/变量键的字典进行编码?

如何使NiFi将数据库单列中的多个值转化为Solr索引中的数组?

匹配来自不同数组的值

如何按键过滤

将环境变量值从 yaml 传递到 json

嵌套存储在字符串变量中的 JSON 对象

判断golang中解析的json响应中是否存在所需的json键(不是值)

使用 jq 将键值行转换为 json

将 js Array() 转换为 JSON 对象以用于 JQuery .ajax

没有默认构造函数的杰克逊第 3 方类

使用 application/json 优于 text/plain 的优势?

Django:TypeError:[] 不是 JSON 可序列化的为什么?

设置对象不是 JSON 可序列化的

仅使用字符串和值解析 JSON 对象