【问题标题】:Getting the first element of json data with jq用jq获取json数据的第一个元素
【发布时间】:2020-12-20 21:19:01
【问题描述】:

我正在使用 Poloniex API。使用returnTicker函数时,数据是这样的。

curl "https://poloniex.com/public?command=returnTicker"

{
  "BTC_BTS": {
    "id": 14,
    "last": "0.00000111",
    "lowestAsk": "0.00000112",
    "highestBid": "0.00000110",
    "percentChange": "0.09900990",
    "baseVolume": "3.12079869",
    "quoteVolume": "2318738.79293715",
    "isFrozen": "0",
    "high24hr": "0.00000152",
    "low24hr": "0.00000098"
  },
  "BTC_DASH": {
    "id": 24,
    "last": "0.00466173",
    "lowestAsk": "0.00466008",
    "highestBid": "0.00464358",
    "percentChange": "0.02318430",
    "baseVolume": "1.98111396",
    "quoteVolume": "425.22973220",
    "isFrozen": "0",
    "high24hr": "0.00482962",
    "low24hr": "0.00450482"
....

  },
  "USDT_GRT": {
    "id": 497,
    "last": "0.72811272",
    "lowestAsk": "0.75999916",
    "highestBid": "0.72740000",
    "percentChange": "0.48594450",
    "baseVolume": "133995.43411815",
    "quoteVolume": "194721.36672887",
    "isFrozen": "0",
    "high24hr": "0.79000000",
    "low24hr": "0.45000020"
  },
  "TRX_SUN": {
    "id": 498,
    "last": "500.00000000",
    "lowestAsk": "449.99999999",
    "highestBid": "100.00000000",
    "percentChange": "0.00000000",
    "baseVolume": "0.00000000",
    "quoteVolume": "0.00000000",
    "isFrozen": "0",
    "high24hr": "0.00000000",
    "low24hr": "0.00000000"
  }
}  


我想要这样的输出

BTC_BTS : 14 : 0.00000111 : 0.00000112 : 0.00000110 : 0.09900990 : 3.12079869 : 2318738.79293715 : 0 : 0.00000152 : 0.00000098
...
USDT_GRT : 497 : 0.72428700 : 0.75999958 : 0.72630001 : 0.47813685 : 133968.74968533 : 194695.96886712 : 0 : 0.79000000 : 0.45000020
TRX_SUN : 498 : 500.00000000 : 449.99999999 : 100.00000000 : 0.00000000 : 0.00000000 : 0.00000000 : 0 : 0.00000000 : 0.00000000

我正在使用 jq,但我的问题是访问货币对名称。

我可以这样做;

14 : 0.00000111 : 0.00000112 : 0.00000110 : 0.09900990 : 3.12079869 : 2318738.79293715 : 0 : 0.00000152 : 0.00000098
...
497 : 0.72428700 : 0.75999958 : 0.72630001 : 0.47813685 : 133968.74968533 : 194695.96886712 : 0 : 0.79000000 : 0.45000020
498 : 500.00000000 : 449.99999999 : 100.00000000 : 0.00000000 : 0.00000000 : 0.00000000 : 0 : 0.00000000 : 0.00000000

通过使用此命令;

curl "https://poloniex.com/public?command=returnTicker" |jq -r | jq '.[] | (.id|tostring) + " : " + (.last|tostring) + " : " + (.lowestAsk|tostring) + " : " + (.highestBid|tostring) + " : " + (.percentChange|tostring) + " : " + (.baseVolume|tostring) + " : " + (.quoteVolume|tostring) + " : " + (.isFrozen|tostring) + " : " + (.high24hr|tostring) + " : " + (.low24hr|tostring)'|jq -r

不仅如此,在每一个jq管道中,我都无法访问json的第一个元素

我不是指 |jq .BTC_BTS 或 |jq .USDT_GRT 管道。

|jq . 给出整个 json,|jq .[] 给出第一个元素之后的子元素。

如何访问第一条路径?

顺便说一句,我可能用 jq 编写了愚蠢而漫长的管道。如果您有任何想法将整个 json 转换为行列数据,我愿意接受您的想法。

谢谢大家的回答。

【问题讨论】:

    标签: json path key element jq


    【解决方案1】:

    为了安全起见,最好不要假设键的顺序在所有内部对象中都是相同的。尔格:

    keys_unsorted as $outer
    | (.[$outer[0]] | keys_unsorted) as $keys
    | $outer[] as $k
    | [ $k, .[$k][$keys[]] ]
    | join(" : ")
    

    【讨论】:

    • 谢谢。为了帮助大家,我想补充一点,这部分必须这样使用" |jq -r 'this command part' 。这样就解决了问题。
    【解决方案2】:

    我认为这可以满足您的需求。

    curl -s "https://poloniex.com/public?command=returnTicker" | \
    jq -r 'to_entries
           | .[] 
           | [ .key, (.value | to_entries | .[] | .value) ] 
           | join(" : ")'
    

    简而言之,将所有内容放在一个数组中,然后使用join 生成所需的输出。

    更新

    正如 luciole75w 所说,我的解决方案步骤太多。这样更好。

    jq -r 'to_entries[] | [ .key, .value[] ] | join(" : ")'
    

    也就是说,我会使用 peak 的解决方案。我的不保证每一行的列都是相同的。

    【讨论】:

    • 我的荣幸。但是,仅作记录,另一个答案更好。
    猜你喜欢
    • 2016-11-24
    • 2021-09-21
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2022-01-19
    相关资源
    最近更新 更多