【问题标题】:Read a bunch of JSON files, transform them, and save them读取一堆 JSON 文件,转换它们并保存它们
【发布时间】:2016-08-29 15:04:33
【问题描述】:

我正在尝试通过Gulp 实现这一目标。

  1. 读取给定目录(包括子目录)中的每个 .json 文件。
  2. 以某种方式对其进行转换,例如添加新的根级别等。
  3. 将它们保存到保持原始结构的新目录中。

我迷失的地方是如何通过管道读取/写入 JSON 到 src。

我现在有以下骨架。

gulp.task("migratefiles", function () {
  return gulp.src("files/**/*.json")
      .pipe(/* WHAT HERE? */)
      .pipe(gulp.dest("processed"));
});

【问题讨论】:

    标签: javascript json gulp


    【解决方案1】:

    有很多方法可以做到这一点:

    (1) 使用gulp-json-transform插件:

    var jsonTransform = require('gulp-json-transform');
    
    gulp.task("migratefiles", function () {
      return gulp.src("files/**/*.json")
        .pipe(jsonTransform(function(json, file) {
          var transformedJson = {
            "newRootLevel": json
          };
          return transformedJson;
        }))
        .pipe(gulp.dest("processed"));
     });
    

    优点:

    • 易于使用
    • 支持异步处理(如果返回Promise)
    • 允许访问每个file 的路径

    缺点:

    • 只有基本的输出格式

    (2) 使用gulp-json-editor插件:

    var jeditor = require('gulp-json-editor');
    
    gulp.task("migratefiles", function () {
       return gulp.src("files/**/*.json")
         .pipe(jeditor(function(json) {
           var transformedJson = {
             "newRootLevel": json
           };
           return transformedJson;
         }))
         .pipe(gulp.dest("processed"));
    });
    

    优点:

    • 易于使用
    • 自动识别输入文件使用的缩进(两个空格、四个空格、制表符等)并相应地格式化输出文件
    • 支持各种js-beautify options

    缺点:

    • 似乎不支持异步处理
    • 似乎没有办法访问每个文件的路径

    (3) 手动操作(通过使用map-stream 直接访问vinyl 文件对象):

    var map = require('map-stream');
    
    gulp.task("migratefiles", function () {
       return gulp.src("files/**/*.json")
         .pipe(map(function(file, done) {
           var json = JSON.parse(file.contents.toString());
           var transformedJson = {
             "newRootLevel": json
           };
           file.contents = new Buffer(JSON.stringify(transformedJson));
           done(null, file);
         }))
         .pipe(gulp.dest("processed"));
    });
    

    优点:

    • 完全控制/访问所有内容
    • 支持异步处理(通过done 回调)

    缺点:

    • 更难使用

    【讨论】:

    • 谢谢你这么详细的回答,我认为我会选择手动处理。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多