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

huangapple go评论67阅读模式
英文:

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

问题

以下是已翻译的代码部分:

encoded_string=$(base64 volunteers.jpg)

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

echo $payload > input.json
cat 'input.json' | jq -r '.instances[0].image.b64' | base64 -d > output.jpg
英文:

I have these 3 commands those work correctly and encode the image as json.

encoded_string=$(base64 volunteers.jpg)

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

echo $payload >input.json

But how do I convert it back to jpg format? This returns an error "base64: invalid input"

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

答案1

得分: 1

以下是翻译好的部分:

问题很可能是由于图像编码部分创建的嵌套换行符导致的。您可以在原始尝试中使用 tr -d \\n 来删除它们,稍微改写一下,利用 jq 的功能从标准输入读取输入。

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

-n 部分是为了避免 jq 读取自己的单独输入流,-R 用于读取原始输入。在这里,我们将编码的内容馈送给 jq,就像它在文件中一样,使用 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
英文:

The problem most likely is due to the embedded newlines that that are created during the encoding part of the image. You can just remove them by using tr -d \\n in your original attempt which an be slightly re-written succinctly with inputs from jq capabilities to read from standard input.

jq -Rn &#39;.instances[0].image.b64 = inputs&#39; &lt; &lt;(base64 volunteers.jpg | tr -d \\n) &gt; input.json

The -n part is to avoid jq reading a separate input stream of its own and -R for reading raw input. Here we feed the encoded content as if it were in a file using bash process substitution syntax &lt;(..) and feed this created file to jq

and then decoding back the created JSON as

jq -r &#39;.instances[0].image.b64&#39; input.json | base64 -d &gt; output.jpg

Re-writing your original attempt with minor enhancements and without using a temporary file for storing the JSON

JSON=&#39;{&quot;instances&quot;: [{&quot;image&quot;: {&quot;b64&quot;: &quot;&#39;&quot;$(base64 volunteers.jpg | tr -d \\n)&quot;&#39;&quot; }}]}&#39;
jq -r &#39;.instances[0].image.b64&#39; &lt;&lt;&lt;&quot;$JSON&quot; | base64 -d &gt;output.jpg

or use printf() inplace of the here-strings(&lt;&lt;&lt;)

printf &#39;%s\n&#39; &quot;$JSON&quot; | jq -r &#39;.instances[0].image.b64&#39; | base64 -d &gt;output.jpg

答案2

得分: 1

调用

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

混乱不堪:cat input.json 就足够了。更好的方式是,假设 input.json 包含有效的 JSON,你可以这样写:

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

The invocation

cat &#39;/&quot;&#39; input.json &#39;/&quot;&#39;

is hopelessly muddled: cat input.json would suffice. Even better, assuming input.json contains valid JSON, you could write:

&lt; input.json jq -r &#39;.instances[0].image.b64&#39; | base64 -d &gt;output.jpg   

huangapple
  • 本文由 发表于 2020年1月3日 18:22:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/59576828.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定