簡體   English   中英

與字符串鍵混合的漂亮打印有效 JSON

[英]Pretty-print valid JSONs mixed with string keys

我有一個 Redis hash 鍵和值,如字符串鍵 - 序列化 JSON 值。 相應的 rediscli 查詢 (hgetall some_redis_hash) 被轉儲到文件中:

redis_key1
{"value1__key1": "value1__value1", "value1__key2": "value1__value2" ...}
redis_key2
{"value2__key1": "value2__value1", "value2__key2": "value2__value2" ...}
...
and so on.

所以問題是,我如何漂亮地打印括號中的這些值? (請注意,如果您嘗試解析整個文件,則之間的鍵字符串會使文檔無效)首先想到的是從 Redis 中獲取特定的對,剝離寄生蟲鍵,並在剩余的有效 JSON 上使用 jq,如下所示:

rediscli hget some_redis_hash redis_key1 > file && tail -n +2 file
- file now contains valid JSON as value, the first string representing Redis key is stripped by tail -
cat file | jq
- produces pretty-printed value -

所以問題是,如何在沒有這種預處理的情況下進行漂亮的打印? 或者(在這種特殊情況下會更好)如何在一個大的 JSON 中合並鍵和值,其中 Redis 鍵可以在上層訪問,然后是它們的值的字典? 像那樣:

rediscli hgetall some_redis_hash > file
cat file | cool_parser
- prints { "redis_key1": {"value1__key1": "value1__value1", ...}, "redis_key2": ... }

進行漂亮打印的簡單方法如下:

cat file | jq --raw-input --raw-output '. as $raw | try fromjson catch $raw'

它嘗試使用 fromjson 將每一行解析為fromjson ,如果不能,則僅輸出原始行(使用$raw )。

--raw-input在那里,因此我們可以調用包含在try中的fromjson而不是直接在每一行上運行它,並且--raw-output在那里,因此任何非 json 行都不會被包含在output。)


僅使用 jq 的問題第二部分的解決方案:

cat file \
    | jq --raw-input --null-input '[inputs] | _nwise(2) | {(.[0]): .[1] | fromjson}' \
    | jq --null-input '[inputs] | add'
  • --null-input結合[inputs]將整個輸入生成為一個數組
  • _nwise(2)然后分成兩組(更多信息關於_nwise
  • 其中{(.[0]): .[1] | fromjson} {(.[0]): .[1] | fromjson}然后轉換成一個 json 列表
  • 哪個| jq --null-input '[inputs] | add' | jq --null-input '[inputs] | add' | jq --null-input '[inputs] | add'然后組合成一個 json

或者在單個 jq 調用中:

cat file | jq --raw-input --null-input \
    '[ [inputs] | _nwise(2) | {(.[0]): .[1] | fromjson} ] | add'

...但是到那時,您最好編寫一個更易於理解的 python 腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM