【问题标题】:best practice to standardize data in JSON objects in a flexible way以灵活的方式标准化 JSON 对象中的数据的最佳实践
【发布时间】:2018-02-24 13:43:29
【问题描述】:

我需要使用 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'
      }
  }
}

这个想法是递归循环对象中的所有属性,并使用一个 Map,该 Map 对每个应该被操作的属性都有一个条目,例如

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

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

但是,我得到的明显印象是这个问题之前已经解决了,所以我想知道是否可以使用 npm 包来代替?

【问题讨论】:

    标签: json node.js


    【解决方案1】:

    在搜索了更多内容并尝试了不同的 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多