将文件读入JSON

时间:2015-10-27 03:23:06

标签: json jq

我想读入几个文件(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 个答案:

答案 0 :(得分:3)

这应该适合你(需要jq 1.5):

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")

P.S。如果你不介意一个尾随的换行符,你可以这样做:

int i, j, c = 0;
  for (i = 0, j = number_of_vertices-1; i < number_of_vertices; j = i++) {
    if ( ((vertices[i].y>p.y) != (vertices[j].y>p.y)) &&
     (p.x < (vertices[j].x-vertices[i].x) * (p.y-vertices[i].y) / (vertices[j].y-vertices[i].y) + vertices[i].x) )
       c = !c;
  }
  return c;

答案 1 :(得分:1)

使用原始输入(-R)命令行选项以字符串形式读取输入。然后你可以建立你的json结果。你也想对多行文本文件(-s)进行诽谤。

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

但是,这仅适用于文本文件。如果您有二进制文件,则必须先对它们进行编码。您可以使用base64来执行此操作。

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

答案 2 :(得分:1)

处理多个文本文件的一种方法如下所示:

(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的解决方案可能更好。