美文网首页
JS在读取json中的值时,遇见undefined字段时的处理

JS在读取json中的值时,遇见undefined字段时的处理

作者: zhangyin | 来源:发表于2018-07-06 17:55 被阅读23次

    从前

    有个前端公陈尸正在开发微信小程序,
    服务器端和前端约定好一个接口应该返回这样一个json:
    '{"res":{"data":{"userInfo":{"card":{"name":"zhangyin"}}}}}';

    于是,前端在收到服务器端返回的json后这样写到:

    var name = res.data.userInfo.card.name;
    var title = "hello " + name;
    

    通常,上面这样写是ok的。

    不过,后来服务器端同学重构代码时,发现某个用户并没有card数据,于是在返回的数据就变成了以下这样:

    {"res":{"data":""}}
    

    于是,前端代码在执行到这句时就发生error了:

    var name = res.data.userInfo.card.name;
    

    并且后面的代码也不会继续执行了,如果后续代码有一些很重要的逻辑也会被错过了。
    而且前端用户也无法看到相应的错误处理提示;

    我们可以使用try ... catch来捕获错误,然后进行处理;
    也可以对json中的逐个层级来进行if判断。
    总之代码写起来都会比较啰嗦,
    有时,写代码到hight处时,会忘记写这些判断;
    所以,我想要不就写个函数来专门检查这种字段缺失导致的错误吧。

    结果发现,当发生这种 在多个json层级中丢失字段的情况 时,
    程序在检查函数被调用起来前就出错了,
    无法将res.data.userInfo.card.name作为一个参数传到函数里;

    于是乎,
    我就花了2秒钟胡乱写了一个方法,试图找到一个简便的处理方式。
    这个方法纯属狗皮膏药式的,难免错漏,
    贴出来仅供大家一乐,不要被我误导~~

    /**
     * 返回一个json层级下的节点内容
     * root : 要被读取的json节点的root节点
     * jsonStr : 要被读取的节点的字符串形式
     * defaultValue : 如果要被读取的节点不存在或为空,则返回该值
     * 
     *  // demo
     *  var jsonStr = '{"res":{"data":null}}';
     *  var jsonRoot = JSON.parse(jsonStr);
     *  var str = utils.jsonObj(jsonRoot,"res.data.userInfo.card.name",undefined);
     */
    function jsonObj(root, jsonStr,defaultValue) {
      if (!root) {
        return defaultValue;
      } else {
        try {
          var nodeNameArray = jsonStr.split('.');
          var tmpRoot = root;
          var i = 0;
          for (var i = 0; i < nodeNameArray.length; i++) {
            var tmpNodeName = nodeNameArray[i];
            var tmpNode = tmpRoot[tmpNodeName];
            if (tmpNode) {
              console.log("." + tmpNodeName);
              tmpRoot = tmpNode;
            } else {
              //发生异常了
              console.log("解析失败," + jsonStr + " 的值为:" + defaultValue);
              return defaultValue;
            }
          }
          //解析完成,tmpRoot即为所求
          console.log(jsonStr + " 的值为:"+tmpNode);
          return tmpNode;
        } catch (e) {
          console.log("try catch." + e);
          return defaultValue;
        }
      }
    }
    

    看到这里,有人肯定会问:

    这不是脱裤子放屁吗?

    前端该如何解析json,难道不是事先就和server端同学商定好了的吗?

    服务端如果不按照事先的约定返回,那是服务端同学的问题啊?

    让服务端同学去改一下不就OK了?

    的确,道理我都懂,就是过不好这一生。

    当有前端+后端配合开发的项目时,很多错误都是通过前端系统被暴露出来的,
    特别是线上的项目,
    有时候错误是很灵异的,需要很多精力去排查,最后才能发现问题所在。

    我认为加一层处理的好处是:应该可以提高排错的速度。
    另外,对于线上的系统,
    多一层防护,
    无论对用户体验还是对系统本身,都会更好一些吧~

    全剧终...

    相关文章

      网友评论

          本文标题:JS在读取json中的值时,遇见undefined字段时的处理

          本文链接:https://www.haomeiwen.com/subject/saebuftx.html