假設我有一個 json 結構,如:
{
"a" : 1,
"b" : 2,
"c" : 3
}
我想要相同的結構,但只有第一個元素:
{
"a" : 1
}
我不知道也不關心密鑰的名稱是什么。我只想要第一個。(能夠獲得任意第n個的獎勵積分。)
我該怎么做jq?
如果我確實知道這個名字,這將很容易:
% echo '{"a":1,"b":2,"c":3}' | jq '{a}'
{
"a": 1
}
這是一個快捷方式:
% echo '{"a":1,"b":2,"c":3}' | jq '{a: .a}'
{
"a": 1
}
有效但可怕的解決方案
在嘗試提出一堆我嘗試過但不起作用的例子時,我終于想出了這個有效的東西:
% echo '{"a":1,"b":2,"c":3}' | jq '{(keys|first):.[(keys|first)]}'
{
"a": 1
}
但這不可能是最好的方法。
值得注意的是,“快捷方式”不起作用:
% echo '{"a":1,"b":2,"c":3}' | jq '{(keys|first)}'
jq: error: syntax error, unexpected '}', expecting ':' (Unix shell quoting issues?) at <top-level>, line 1:
{(keys|first)}
jq: 1 compile error
這也有效,但幾乎沒有更好,如果不是更糟的話:
% echo '{"a":1,"b":2,"c":3}' | jq '(keys|first) as $i | {($i): .[$i]}'
{
"a": 1
}
(“捷徑”在這里也不起作用。)
怎么回事?
另外,如果我不使用括號$i作為鍵,就會發生我根本不理解的瘋狂:
% echo '{"a":1,"b":2,"c":3}' | jq '(keys|first) as $i | {$i: .[$i]}'
jq: error: syntax error, unexpected ':', expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
(keys|first) as $i | {$i: .[$i]}
jq: error: May need parentheses around object key expression at <top-level>, line 1:
(keys|first) as $i | {$i: .[$i]}
jq: 2 compile errors
% echo '{"a":1,"b":2,"c":3}' | jq '(keys|first) as $i | {$i}'
{
"i": "a"
}
其他不起作用的東西
% echo '{"a":1,"b":2,"c":3}' | jq 'first'
jq: error (at <stdin>:1): Cannot index object with number
% echo '{"a":1,"b":2,"c":3}' | jq 'first(.)'
{
"a": 1,
"b": 2,
"c": 3
}
% echo '{"a":1,"b":2,"c":3}' | jq 'first(.[])'
1
uj5u.com熱心網友回復:
使用to_entries,from_entries和您選擇的索引。
在單元素語法中,您需要將其包裝在陣列中
jq '[to_entries[0]] | from_entries'
演示
在范圍語法中,您需要另外提供 to-index(如果您只想要 1 個元素,它比 from-index 高一個):
jq 'to_entries[0:1] | from_entries'
演示
輸出:
{
"a": 1
}
uj5u.com熱心網友回復:
在評論中你說
我只是希望有更多類似的東西
.[0]
如果您不喜歡其他解決方案的管道,那么如何使用字串插值:
jq '{"\(keys_unsorted[0])"}'
{
"a": 1
}
演示
請注意,您使用的所有原始嘗試都按字母順序keys提供了鍵。對于示例資料,這沒有什么區別,但我假設您實際上是在尋找您需要使用的表示順序中的第一個鍵。如果我錯了,那么我的答案翻譯成也應該可以正常作業。keys_unsorted{"\(keys[0])"}
uj5u.com熱心網友回復:
作為記錄,假設第一個鍵的值是原子的,您可以像這樣使用 jq 的流決議器:
jq -nc --stream 'fromstream(input, [[null]])'
要么:
jq -nc --stream 'input as $in | setpath($in[0]; $in[1])'
處理一般情況可能不值得付出努力,但為了記錄,這里有一個函式可以這樣做:
def firstKeyValue:
def firstRun(s):
label $out
| foreach s as $x (null;
if . == null then $x[0][0] elif . == $x[0][0] then . else break $out end;
$x);
fromstream(firstRun(tostream),[[null]]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/426795.html
上一篇:如何定位同一物件的另一個值?
下一篇:根據條件從JSON檔案中獲取值
