Json

如何將嵌入(引用)的 json 字元串轉換為 json

  • April 27, 2018

我熟悉用於解析 json 的“jq”。

我使用一項產生 json 響應的服務,其中一個屬性本身就是一個 json 字元串。如何將該引用值轉換為有效的 json 字元串,以便我可以使用 jq 處理它?

例如,如果我只是從“jq.”查看簡單的漂亮列印的 json,這裡是輸出的簡短摘錄:

"someJsonString": "{\"date\":\"2018-01-08\", ...

我可以使用 jq 來獲取該屬性的值,但我需要通過“取消轉義”將引用的字元串轉換為有效的 json。

我想我可以將它導入 sed,刪除開始和結束雙引號,並刪除所有反斜杠(“ sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'”)。這似乎可行,但這似乎不是最強大的解決方案。

更新

為了更清楚地了解我在做什麼,這裡有幾個省略的範例顯示了我嘗試過的內容:

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

更新

這是一個完全獨立的範例:

% cat stuff.json | jq .
{
 "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

更新

如果我嘗試使用真正的 jq 表達式處理最後一個輸出,它會執行以下操作:

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)

有一個raw標誌

   -r      output raw strings, not JSON texts;
jq -rc .stuff stuff.json

輸出

{"date":"2018-01-08"}

jq的**fromjson**功能:

樣本stuff.json內容:

{
 "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

輸出:

{"date":"2018-01-08"}

引用自:https://unix.stackexchange.com/questions/415679