如何正确地将XML串行化以作为CURL命令的一部分放入JSON主体中

时间:2017-12-07 21:45:43

标签: json xml bash shell curl

我想在CURL命令中将XML文件添加到我的JSON请求体。这就是我现在所拥有的

data=$(cat testdata.xml)
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ "data": ''"$(echo $data)"''}' 'http://...'

然而,这会发送{ data: '$(echo $data)' } }而不是实际提取文件。

如果我在$(echo $ data)周围取出外部单引号,如下所示:

data=$(cat testdata.xml)
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ "data": '"$(echo $data)"'}' 'http://...'

然后我遇到错误意外令牌<在JSON的第10位

因为服务器正在阅读

'{ "data": <?xml version="1.0" encoding="UTF-8"?> - <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don\'t forget me this weekend!</body> </note>}',

我该如何解决这个问题?请注意,我不想先转换为JSON。我只想在body中发送字符串化的xml文件。

1 个答案:

答案 0 :(得分:2)

与往常一样,使用jq在bash中生成正确转义的JSON。

data=$(jq -Rs '{ "data": . }' <testdata.xml)
curl -X POST \
     --header 'Content-Type: application/json' \
     --header 'Accept: application/json' \
     -d "$data" \
     "$url"

如果您没有安装jq,则可以使用Python作为作业,将以下内容替换为使用jq的行:

data=$(python -c 'import json, sys; json.dump({"data": sys.stdin.read()}, sys.stdout)' <testdata.xml)