Javascript 以编程方式替换JSON对象

Javascript 以编程方式替换JSON对象,javascript,regex,json,replace,sed,Javascript,Regex,Json,Replace,Sed,我正在寻找替换文件中JSON对象的最有效方法 20150628-在本文底部更新 以下是场景: 我有一堆JSON文件(很多),在这些文件中有大块JSON(有时是20-30K行)。这些是我们拥有的各种测试例程的配置。最近,需要进行更改才能从以下位置更改对象: "createdAt": { "year": 2014, "month": 11, "dayOfMonth": 24, "hourOfDay": 2, "minute": 22, "second"

我正在寻找替换文件中JSON对象的最有效方法

20150628-在本文底部更新

以下是场景:

我有一堆JSON文件(很多),在这些文件中有大块JSON(有时是20-30K行)。这些是我们拥有的各种测试例程的配置。最近,需要进行更改才能从以下位置更改对象:

"createdAt": {
    "year": 2014,
    "month": 11,
    "dayOfMonth": 24,
    "hourOfDay": 2,
    "minute": 22,
    "second": 54
}
以这样的格式:

"createdAt":"2015-05-12T21:14:51Z"
让我们更容易些。我想用以下内容替换我的JSON对象(可能有很多)中的所有
createdAt
updatedAt
字段:

每个文件中有许多(100个)对象,字段值不同。我需要检查并用新格式替换每个
createdAt
updatedAt
对象。日期不重要。我可以让他们做任何事

我可以手工完成这项工作,但我要花上一两天的时间才能完成全部的全职工作(我知道,我试着做一个文件,但在我放弃了1/2小时后,时间太长了)

如何以编程方式执行此操作

正则表达式?塞德?还有别的吗

最后一点:我只需要做一次。在那之后,我就不需要再做了

谢谢你的提示

示例JSON:(想象一下真正的是30000行!):)

更新20150628

对于那些想知道的人,这是我写的gulpfile,完全是为了实现我想要的。这是基于公认的答案。它将递归地在树中搜索我要查找的内容,并在找到时替换它。这并不是世界上最漂亮的东西,但它确实满足了我的需要,并为我节省了几周的人工时间。处理所有文件的总时间?100毫秒以下。太棒了

var gulp = require('gulp');
var change = require('gulp-change');

function searchTreeForDates(obj) {
    if(typeof(obj) === 'object') {
        for (var key in obj) {
            if (typeof(obj[key]) === 'object' && (key === 'createdAt' || key === 'updatedAt')) {
                obj[key] = "2015-06-29T00:53:00Z";
            } else {
                obj[key] = searchTreeForDates(obj[key])
            }
        }
    }
    return obj; 
}

function updateDate(content) {
    var obj = JSON.parse(content);
    obj = searchTreeForDates(obj);
    return JSON.stringify(obj);
}

gulp.task('change', function() {
    return gulp.src('*.json')
        .pipe(change(updateDate))
        .pipe(gulp.dest('changed/'))
});
为什么不手动

   function formatDate(dateObject){
       var formattedDate = 
                  dateObject['year']+'-'+
                  dateObject['month']+'-'+ 
                  dateObject['dayOfMonth']+'T'+
                  dateObject['hourOfDay']+':'+
                  dateObject['minute']+':'+
                  dateObject['second']+'Z';
    }
    var jsonArray = {...};

    for(var key in jsonArray){
        for(var i = 0; i < jsonArray[key].length; i++){
            jsonArray[key][i]['createdAt'] = formatDate(jsonArray[key]['createdAt']); 
            jsonArray[key][i]['updatedAt'] = formatDate(jsonArray[key]['updatedAt']); 

    }
}
函数formatDate(dateObject){
var formattedDate=
dateObject['year']+'-'+
dateObject['month']+'-'+
dateObject['dayOfMonth']+'T'+
dateObject['hourOfDay']+':'+
dateObject['minute']+':'+
dateObject['second']+'Z';
}
var jsonArray={…};
for(jsonArray中的var键){
对于(var i=0;i
这是一个初步尝试。您可以实现自己的“日期解析逻辑”,它要求您安装gulp。并将其保存在gulpfile.js中。您可能需要循环所有属于“日期”对象的属性。但这一逻辑并不难

var gulp = require('gulp');
var change = require('change');

function translateDate(dateField){
    return dateField.A + dateField.b + ...;

}
function updateDate(content) {
    var obj = JSON.parse(content);
    //loop over the obj properties and call the below
    // for the ones you want to change.
    obj.dateField = translateDate(obj.dateField);
    return JSON.stringify(obj);
}

gulp.task('change', function() {
    return gulp.src('**/*.json')
      .pipe(change(updateDate))
      .pipe(gulp.dest('changed/'))
});

打开每个文件,使用convert函数更改属性,然后保存新的JSON:

function changeDate(obj) {
  var newObject = obj.year + '-' + obj.month + '-' + obj.dayOfMonth + 'T' + obj.hourOfDay + ':' + obj.minute + ':' + obj.second;
  return newObject;
}

// here you open the file and stores it's content in the products variable.
for (var i = 0; i < products.length; i++) {
  var product = products[i];
  product.product.createdAt = changeDate(product.product.createdAt);
  product.product.updatedAt = changeDate(product.product.updatedAt);
}
// .. now you need to save the modified json
功能更改日期(obj){
var newObject=obj.year+'-'+obj.month+'-'+obj.dayofmon+'T'+obj.hourOfDay+':'+obj.minute+':'+obj.second;
返回newObject;
}
//在这里打开文件并将其内容存储在products变量中。
对于(变量i=0;i
如果是我,我会编写一个节点脚本,将其读取为JSON,然后将其写回JSON。基本上,将日期对象转换为字符串,然后将其保存回去。我不想为您编写代码,但这至少是一个起点。我不会选择手动文本文件解析-您熟悉哪些编程语言/环境?您几乎可以用任何可以读写JSON的语言来实现这一点—它将读取和反序列化现有的JSON,根据需要转换适用的字段,然后序列化和重写文件。@JoeEnos great minds think a like;)我将编写一个Node.js脚本,使用流进行文件I/o。使用
fs
streams来读取数据和写入结果,中间还有一个简单的转换流。现在我想到了,你甚至可以使用gulpjs来完成。(现在我对它感兴趣)问题是,这些createdAt和updatedAt在json文件中无处不在。上面的例子非常简单。我基本上需要遍历整个JSON树。不难,只是想知道我是不是走错路了。在最后一个时间戳上输出“Z”时,一定要注意无时区的日期结构……我现在只需要取一个已知的值,并将其放入这些字段中。谢谢你的提醒!我已经安装了gulp和node/等。这看起来与我正在做的类似,只是更加优雅了!:)谢谢我会用这个作为我的新跳伞。我很高兴当时我走的是正确的道路。谢谢@nix如果你有任何问题,请告诉我。用你上面的方法作为灵感,写下我所需要的。谢谢你的提示。
   function formatDate(dateObject){
       var formattedDate = 
                  dateObject['year']+'-'+
                  dateObject['month']+'-'+ 
                  dateObject['dayOfMonth']+'T'+
                  dateObject['hourOfDay']+':'+
                  dateObject['minute']+':'+
                  dateObject['second']+'Z';
    }
    var jsonArray = {...};

    for(var key in jsonArray){
        for(var i = 0; i < jsonArray[key].length; i++){
            jsonArray[key][i]['createdAt'] = formatDate(jsonArray[key]['createdAt']); 
            jsonArray[key][i]['updatedAt'] = formatDate(jsonArray[key]['updatedAt']); 

    }
}
var gulp = require('gulp');
var change = require('change');

function translateDate(dateField){
    return dateField.A + dateField.b + ...;

}
function updateDate(content) {
    var obj = JSON.parse(content);
    //loop over the obj properties and call the below
    // for the ones you want to change.
    obj.dateField = translateDate(obj.dateField);
    return JSON.stringify(obj);
}

gulp.task('change', function() {
    return gulp.src('**/*.json')
      .pipe(change(updateDate))
      .pipe(gulp.dest('changed/'))
});
function changeDate(obj) {
  var newObject = obj.year + '-' + obj.month + '-' + obj.dayOfMonth + 'T' + obj.hourOfDay + ':' + obj.minute + ':' + obj.second;
  return newObject;
}

// here you open the file and stores it's content in the products variable.
for (var i = 0; i < products.length; i++) {
  var product = products[i];
  product.product.createdAt = changeDate(product.product.createdAt);
  product.product.updatedAt = changeDate(product.product.updatedAt);
}
// .. now you need to save the modified json