将文件读入 JSON

6

我希望读取多个文件(index.html,style.css,main.js),以创建一个JSON有效载荷进行上传。

我知道使用nodejs,可以开始创建所需的内容,如下:

var fs = require('fs');
fs.readFile('index.html', 'utf8', function (err, data) {
  if (err) throw err;
  out = JSON.stringify({"html": data});
  console.log(out);
});

那么我如何使用jq实现这个功能呢?

3个回答

3

使用原始输入 (-R) 命令行选项将输入读取为字符串。然后,您可以构建您的 JSON 结果。对于多行文本文件,您还需要使用 slurp (-s)。

$ jq -Rs '{ html: . }' index.html

然而,这仅适用于文本文件。如果您有二进制文件,则必须先对其进行编码。您可以使用base64来完成此操作。

$ base64 -w0 image.jpg | jq -R '{ jpg: . }'

看起来不太对。http://s.natalian.org/2015-10-27/1445930412_1912x1036.png 还有兴趣为几个文件做这个。 - hendry
那是一个二进制文件,你需要先进行编码。 - Jeff Mercado
吞入(Slurp)确实是必需的,但如何处理附加文件?例如,jq -Rs '{ html: ., js .}' index.html main.js 是无效的。 - hendry
@peak:啊,是的,针对多行文本文件。谢谢。 - Jeff Mercado
@hendry: jq并不适合组合多个文件。对于某些事情它可以做到一些程度,但不适合做更多的事情。你是否有更完整的示例,演示了你想要如何组合这些文件以及它们的类型?你所要求的可能无需额外的外部工具就能实现,但如何处理每种类型将会有所不同。 - Jeff Mercado

3
这应该适用于您(需要jq 1.5):
jq --null-input --raw-input \
  'reduce inputs as $line ({}; .[input_filename] += [$line]) | map_values(join("\n"))' \
  index.html style.css main.js

这就是过滤器,非常简单:

reduce inputs as $line ({}; .[input_filename] += [$line])
| map_values(join("\n"))

例子:

$ cat test1.txt
foo
bar
baz

$ cat test2.txt
qux
quux
quuux

$ jq --null-input --raw-input \
  'reduce inputs as $line ({}; .[input_filename] += [$line]) | map_values(join("\n"))' \
  test1.txt test2.txt
{
  "test1.txt": "foo\nbar\nbaz",
  "test2.txt": "qux\nquux\nquuux"
}

附言:如果您不介意有一个结尾换行符,您可以使用以下方法:

reduce inputs as $line ({}; .[input_filename] += "\($line)\n")

2

以下是处理多个文本文件的一种方法:

(jq -Rs . a.txt ; jq -sR . b.txt) | jq -s
[
  "1\n2\n",
  "3\n4\n"
]

所以在您的情况下,您需要做如下操作:
(jq -Rs '{ html: . }' index.html; \
 jq -Rs '{ javascript: . }' main.js; \
 jq -Rs '{ css: . }' style.css) |\
 jq -s add

也就是说,将每个文本文件单独转换为JSON字符串,然后将这些字符串传输到jq中。这样做的好处是不需要使用jq 1.5,但如果您有jq 1.5,则使用过滤器inputs的解决方案可能更可取。

关闭!你能把你的答案改成(jq -Rs '{ html: . }' index.html; jq -Rs '{ javascript: . }' main.js; jq -Rs '{ css: . }' style.css) | jq -s add吗?这是我发现对我有效的方法。 - hendry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接