以灵活的方式标准化JSON对象中的数据的最佳实践

时间:2017-09-15 11:17:12

标签: json node.js

我需要使用NodeJS将各种结构化格式的信息转换为其他格式(例如html或文本)。所以我采用这种方法将源格式转换为基于JSON-Schemas的JSON。我也可以根据Pug模板将生成的JSON转换为文本。

我现在正在寻找的是一种灵活的方式来标准化数据并简化JSON中的结构,因此在例如日期和时间格式。

此类对象的一个​​例子是:

{
  header: {
      sender: {
         // more properties
         id: '12345';
      }
      receiver: {
         // more properties
         id: '987654';
      }
      date: {
         date: '170910',
         time: '0922'
      }
      // more properties
  }
  // more properties
  someMore: {
      birthdate: {
          year: 2016,
          month: 5,
          day: 11
      }
      otherProperty: {
          // more properties
          date: '20170205'
      } 
  }      
}

我想将此转换为

{
  header: {
      senderId: '12345',
      receiverId: '987654'
      date: '20170910T0922'
  }
  // more properties
  someMore: {
      birthdate: '20160511',
      otherProperty: {
        // more properties
        date: '20170205'
      }
  }
}

我们的想法是递归循环遍历对象中的所有属性,并使用一个具有een条目的Map,用于应该对其执行操作的每个属性,例如

var map = new Map();
map.set('sender', getSender());
map.set('date', normalizeDate());
map.set('birthdate', normalizeDate());

对于每个属性键,检查映射,如果它返回一个函数,则执行该函数,否则执行 该属性已创建,循环继续。

但是,我之前已经解决了这个问题的独特印象,所以我想知道是否有可以使用的npm包呢?

1 个答案:

答案 0 :(得分:0)

在搜索了更多内容并尝试了不同的JSON变换器之后,我选择dot-object,因为它提供了一种简单的方法来转换部分结构中的多个规则'一气呵成。

我放弃了编写大量常规规范化函数的想法,并且只针对最明显的函数(性别和日期/时间)进行了解决,并通过将各种结构转换为单个标准化结构来处理它们,然后应用适当的功能

这可能不是最优雅的方法,但我是时间限制,这是有效的。

要按照问题中的描述将源转换为结果,请使用以下代码:

const dot = require('dot-object');

const rules = {
  'header.sender.id': 'header.senderId',
  'header.receiver.id': 'header.receiverId'
};

const target = {};

dot.transform(rules, src, target);

// normalizing

target.date = normalizeDate(target.date);
target.someMore.birthdate = normalizeDate(target.someMore.birthdate);
target.someMore.otherProperty.date = normalizeDate(target.someMore.otherProperty.date);