将base64图像字符串编码为JSON,然后使用jq将其解码回

时间:2020-01-03 10:22:26

标签: base64 jq

我有这3个命令,它们可以正常工作并将图像编码为json。

encoded_string=$(base64 volunteers.jpg)

payload="{\"instances\": [{\"image\": {\"b64\": \"$encoded_string\"}}]}"

echo $payload >input.json

但是如何将其转换回jpg格式?这将返回错误“ base64:无效输入

cat '/"' input.json '/"' | jq -r '.instances[0].image.b64' | base64 -d >output.jpg

2 个答案:

答案 0 :(得分:1)

该问题很可能是由于在图像的编码部分期间创建的嵌入换行符造成的。您只需在原始尝试中使用tr -d \\n即可将其删除,并使用jq功能的输入略微重写一下,以从标准输入中读取内容。

jq -Rn '.instances[0].image.b64 = inputs' < <(base64 volunteers.jpg | tr -d \\n) > input.json

-n部分是为了避免jq自己读取单独的输入流和-R来读取原始输入。在这里,我们使用bash流程替换语法<(..)来将编码后的内容当作文件中的内容,并将此创建的文件馈送到jq

,然后将创建的JSON解码回

jq -r '.instances[0].image.b64' input.json | base64 -d > output.jpg

使用较小的增强功能重写原始尝试,而无需使用临时文件来存储JSON

JSON='{"instances": [{"image": {"b64": "'"$(base64 volunteers.jpg | tr -d \\n)"'" }}]}'
jq -r '.instances[0].image.b64' <<<"$JSON" | base64 -d >output.jpg

或使用printf()代替here-strings(<<<

printf '%s\n' "$JSON" | jq -r '.instances[0].image.b64' | base64 -d >output.jpg

答案 1 :(得分:1)

调用

cat '/"' input.json '/"'

毫无希望地被弄糊涂了:cat input.json就足够了。更好的是,假设input.json包含有效的JSON,则可以编写:

< input.json jq -r '.instances[0].image.b64' | base64 -d >output.jpg