[...] avec une apostrophe dedans, le JSON est invalide.
Pas selon https://www.json.org. Une apostrophe est autorisée dans une chaîne JSON.
Comment puis-je échapper les caractères nécessaires dans bash ?
Vous pouvez utiliser xidel pour préparer correctement le JSON que vous souhaitez envoyer via POST.
Comme https://example.com
ne peut pas être testé, je vais utiliser https://api.github.com/markdown
(voir cette réponse) comme exemple.
Supposons 'çömmít' "mêssågè"
comme la sortie exotique de git log -n 1 --pretty=format:'%s'
.
Créez l'objet JSON (sérialisé) avec la valeur de l'attribut "text"
correctement échappé :
$ git log -n 1 --pretty=format:'%s' | \
xidel -se 'serialize({"text":$raw},{"method":"json","encoding":"us-ascii"})'
{"text":"'\u00E7\u00F6mm\u00EDt' \"m\u00EAss\u00E5g\u00E8\""}
Curl (variable)
$ eval "$(
git log -n 1 --pretty=format:'%s' | \
xidel -se 'msg:=serialize({"text":$raw},{"method":"json","encoding":"us-ascii"})' --output-format=bash
)"
$ echo $msg
{"text":"'\u00E7\u00F6mm\u00EDt' \"m\u00EAss\u00E5g\u00E8\""}
$ curl -d "$msg" https://api.github.com/markdown
'çömmít' "mêssågè"
Curl (pipe)
$ git log -n 1 --pretty=format:'%s' | \
xidel -se 'serialize({"text":$raw},{"method":"json","encoding":"us-ascii"})' | \
curl -d@- https://api.github.com/markdown
'çömmít' "mêssågè"
En réalité, il n'est pas nécessaire d'utiliser curl
si vous utilisez déjà xidel
.
Xidel (pipe)
$ git log -n 1 --pretty=format:'%s' | \
xidel -s \
-d '{serialize({"text":read()},{"method":"json","encoding":"us-ascii"})}' \
"https://api.github.com/markdown" \
-e '$raw'
'çömmít' "mêssågè"
Xidel (pipe, in-query)
$ git log -n 1 --pretty=format:'%s' | \
xidel -se '
x:request({
"post":serialize(
{"text":$raw},
{"method":"json","encoding":"us-ascii"}
),
"url":"https://api.github.com/markdown"
})/raw
'
'çömmít' "mêssågè"
Xidel (all in-query)
$ xidel -se '
x:request({
"post":serialize(
{"text":system("git log -n 1 --pretty=format:'\''%s'\''")},
{"method":"json","encoding":"us-ascii"}
),
"url":"https://api.github.com/markdown"
})/raw
'
'çömmít' "mêssågè"