web-dev-qa-db-ja.com

ヒアドキュメントのJSONコンテンツが解析できないのはなぜですか?

JSONフラグメントがあります。

以下は機能しません。

VALUE=<<PERSON
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]"  
}
PERSON
echo -n "$VALUE" | python -m json.tool

結果は次のとおりです。

JSONオブジェクトをデコードできませんでした

jqを使用して同じことを行うe。

echo -n "$VALUE" | jq '.'

出力はありません。

以下についても同じ動作があります。

VALUE=<<PERSON
'{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]"  
}'
PERSON
echo -n "$VALUE" | python -m json.tool

応答:

JSONオブジェクトをデコードできませんでした

しかし、次の作品:

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
11
Jim
VALUE=<<PERSON
some data
PERSON

echo "$VALUE"

出力なし。

Here-documentはredirectionです。変数にリダイレクトすることはできません。

コマンドラインが解析されると、リダイレクトは変数の割り当てとは別のステップで処理されます。したがって、コマンドは(スペースに注意)と同等です。

VALUE= <<PERSON
some data
PERSON

つまり、空の文字列を変数に割り当て、標準入力をhere-stringからコマンドにリダイレクトします(ただし、コマンドがないため、何も起こりません)。

ご了承ください

<<PERSON
some data
PERSON

そのまま有効です

<somefile

データが含まれるように標準入力ストリームを設定できるコマンドがないため、失われるだけです。

これはうまくいくでしょう:

VALUE=$(cat <<PERSON
some data
PERSON
)

ここで、ヒアドキュメントを受け取るコマンドはcatであり、標準出力にコピーします。これは、コマンド置換によって変数に割り当てられるものです。

あなたのケースでは、代わりに使用できます

python -m json.tool <<END_JSON
JSON data here
END_JSON

変数にデータを格納するという余分なステップを踏むことなく。

19
Kusalananda

変数がヒアドキュメントによって設定されていないため:

$ VALUE=<<PERSON  
> {    
>   "type": "account",  
>   "customer_id": "1234",  
>   "customer_email": "[email protected]",  
> }  
> PERSON
$ echo "$VALUE" 

$

ヒアドキュメントを使用して変数に値を割り当てる場合は、次のようなものが必要です。

$ read -d '' -r VALUE <<PERSON  
{    
  "type": "account",  
  "customer_id": "1234",  
  "customer_email": "[email protected]",  
}   
PERSON
11
terdon

これは、JSONで使用するヒアドキュメントを定義した方法が間違っているためです。あなたはそれを次のように使う必要があります

VALUE=$(cat <<EOF
{  
  "type": "account",  
  "customer_id": "1234",  
  "customer_email": "[email protected]",  
}
EOF
)

そしてprintf "$VALUE"は期待どおりにJSONをダンプする必要があります。

5
Inian

ヒアドキュメントと変数はうまく混合しないか、少なくともこのように混合しません。あなたはどちらかができます…

ヒアドキュメントをアプリケーションの標準入力として渡す

python -m json.tool <<PERSON  
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]",
}
PERSON

または…

シェル変数に複数行のテキストを格納する

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]",
}'

内側の二重引用符をエスケープする必要がないように、一重引用符を使用しました。もちろん、二重引用符を使用することもできます。 g。パラメータを拡張する必要がある場合:

VALUE="{
  \"type\": \"account\",
  \"customer_id\": ${ID},
  \"customer_email\": \"${EMAIL}\",
}"

その後、変数値を後で使用できます。

echo -n "$VALUE" | python -m json.tool
3
David Foerster