将 base64 图像字符串编码为 JSON 并使用 jq 将其解码回来

Encoding base64 image string into JSON and decoding it back using jq

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

encoded_string=$(base64 volunteers.jpg)

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

echo $payload >input.json

但是如何将它转换回jpg格式呢?这 returns 一个错误“base64:无效输入

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

问题很可能是由于在图像的编码部分创建的嵌入换行符造成的。您可以在最初的尝试中使用 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() 代替此处的字符串 (<<<)

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

调用

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

糊涂得无可救药:cat input.json就够了。更好的是,假设 input.json 包含有效的 JSON,您可以这样写:

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