二重引用符をエスケープせずに正しい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各単語はファイル名(別名ワイルドカード)を生成します。

デフォルト値$IFSには、スペース、タブ、および改行が含まれます。スペース、タブ、改行も分割時に特別に処理されます。その理由は、その順序が1と計算され、先行順序と後続順序が無視されるためです。たとえば、

var='  foo  *
bar'

echo $var

$varまずfoo、、、*bar分けるセクション)*現在のディレクトリ(全体的な状況部分)。

コンテンツをそのまま表示するには(ただし、多くの実装echoでコンテンツが破損する可能性があることに注意してください)、次のように書くことができます。

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

これで、ギャップを圧縮することが目的であれば、分割+グローブ演算子を使用することができます。

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    }  ]

(改行文字は削除されましたが(前にバックスラッシュを追加せずに一部を保持することを選択できます)、他の空白文字は変更されていません。

おすすめ記事