是否可以不轉義雙引號並獲得正確的 json 格式?

是否可以不轉義雙引號並獲得正確的 json 格式?

我想使用httpie提交json資料。

如果我使用雙引號並轉義鍵周圍的雙引號,它就可以工作。

json="[ \
    { \
        \"count\": 3 \
    } \
]"

echo $json

[ {“計數”:3 }]

但我不想逃避。下面的複製貼上比較容易,但是不行。

json='[ \
    { \
        "count": 3 \
    } \
]'

echo $json

[ \ { \ 「計數」:3 \ } \ ]

那麼,是否有可能不轉義 json 鍵周圍的雙引號,從而更容易從某處複製並貼上?

答案1

var="foo\
bar"

雙引號內的序列\<newline>是特殊的,但單引號內的序列不是特殊的,並且是已刪除,所以$var包含foobar.

當你在做的時候:

echo $json

您正在使用 split+glob 運算子(當您忘記引用擴充功能時呼叫的隱式運算子),也就是說, 的內容會$json根據 中的字元進行拆分$IFS,並且每個單字都會產生檔案名稱(也稱為globbing )。

預設值$IFS包含空格製表符和換行符(空格、製表符和換行符也恰好在分割方面得到特殊處理,因為它們的任何序列都計數為 1,並且忽略前導和尾隨序列)。例如:

var='  foo  *
bar'

echo $var

$var首先分為foo,*bar(分裂部分)並*擴展到目前目錄中的非隱藏檔案清單(全域部分)。

如果您想按原樣顯示內容(但請注意,許多echo實作可能會破壞內容),您可以撰寫:

$ echo "$json"
[     {         "count": 3     } ]

現在,如果您的目的是壓縮間距,也許您可以使用 split+glob 運算子來發揮您的優勢。

json='
  [
    {
      "count": 3
    }
  ]'

unset -v IFS # make sure we get a default splitting behaviour.
             # an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part

echo $json # use the split+glob operator

echo輸出以空格分隔的參數,因此每個空格、製表符或換行符序列實際上都會被單個空格字元替換(前導和尾隨字元除外,它們將被刪除,並echo在最後添加一個換行符)。所以你會得到:

[ { "count": 3 } ]

在任何情況下,這都不會區分空格是否在引號內,因此它可能會改變 json 資料的含義(例如"foo bar"將被轉換為)。"foo bar"

如果您想使用\<newline>序列來轉義(刪除)換行符,但保留其他空白字符,而不必轉義雙引號字符,則可以使用此處文件:

json=$(cat <<EOF
  [\
    {\
      "count": 3\
    }\
  ]
EOF
)
echo "$json"

這會給出:

  [    {      "count": 3    }  ]

(換行符已被刪除(您可以選擇保留其中一些換行符,而不是在它們前面添加反斜線),但其他空白字元保持不變)。

答案2

不需要反斜線來繼續引號內的行。在第二個範例中,反斜線是非常有害的,因為在單引號內它們將保持原樣,從而使字串在語法上無效。只要去掉反斜線就可以了。

相關內容