【问题标题】:Checking sanity of a JSON object [duplicate]检查 JSON 对象的健全性 [重复]
【发布时间】:2016-03-07 08:11:03
【问题描述】:

我必须一次又一次地处理代码,例如考虑以下假设示例:

if (node.data.creatures.humans.women.number === Infinity) {
  // do-someting
}

现在,问题是如果节点未定义,这个条件就会中断。同样,如果 node.data 未定义,node.data.creatures 未定义等等,它将中断。

所以我最终使用了以下类型的长条件:

if (node && node.data && node.data.creatures && node.data.creatures.humans && node.data.creatures.women && node.data.creatures.humans.women.number === Infinity) {
  // do-someting
}

现在,想象一下我还必须在代码的许多其他部分中使用该 JSON 对象的一部分。

代码突然开始变得非常难看。由于我提到的第一个条件,有没有更好的方法来避免诸如“无法调用未定义的属性”之类的错误,这样代码看起来也更好。

你如何处理这种情况?

【问题讨论】:

  • 新的Proxy API(相当新,支持有限)可以轻松解决这个问题:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • 请注意,它是一个 JavaScript 对象,而不是 JSON 对象。数据的 JSON 表示,如果您以 JSON 格式解析该数据,您将得到一个 JavaScript 对象作为结果。

标签: javascript json object sanity-check


【解决方案1】:

这是我正在使用的,它可能不是“最优化”的方式,但是对我有用:

walkObject = function(obj, path) {
  var i = 0,
    part = void 0,
    parts = path.split('.');

  while (obj && (part = parts[i++])) {
    obj = obj[part];
  }
  return obj;
};

该方法接受一个对象,以及包含您要测试的属性的点表示法的字符串:

// the object
var obj = { a: { b: {c: [1,2,3], d: "aa"} } };

// tests
console.log("a,b,c", walkObject(obj, 'a.b.c')); // [1,2,3]
console.log("a,b,e", walkObject(obj, 'a.b.e')); // undefined
console.log("z,b,e", walkObject(obj, 'z.b.e')); // undefined

【讨论】:

    【解决方案2】:

    尝试访问undefined 上的属性是可捕获的 TypeError,因此您可以使用try..catch

    try {
        if (node.data.creatures.humans.women.number === Infinity) {
            // do something
        }
    } catch (e) {
        // property doesn't exist
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用try - catch 包裹可能有害的部分:

      try {
          if (node.data.creatures.humans.women.number === Infinity) {
              // do-someting
          }
      } catch () {
          console.log(e);
      }
      

      另一种可能更优雅的方法是定义预期的对象结构并将其与实际数据合并,例如使用jQuery.extend()

      var nodeTemplate = {
          data: {
              creatures: {
                  humans: {...}
              }
          }
      }
      

      这将确保结构符合您的预期,并且不存在的字段具有一些默认值。

      然后合并:

      node = $.extend(nodeTemplate, node);
      

      【讨论】:

        猜你喜欢
        • 2011-01-12
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多