【问题标题】:Is there a more beautiful way to catch errors on a block of JSON Arrays? [duplicate]有没有更漂亮的方法来捕获 JSON 数组块上的错误? [复制]
【发布时间】:2019-11-17 00:46:54
【问题描述】:

我有一堆需要解析的 JSON 数据,但其中一些不存在。

因此,我目前有以下try/catch(e),但有没有更优雅的方法呢?

for (var u = 0; u < 100; u++) {
      try {
        var reactions = JSON.parse(dataParsed.data[u].reactions.summary.total_count)
      } catch (err) {
        console.log(err)
        var reactions = 0
      }
      try {
        var comments = JSON.parse(dataParsed.data[u].comments.summary.total_count)
      } catch (err) {
        var comments = 0
      }
      try {
        var shares = JSON.parse(dataParsed.data[u].shares.count);
      } catch (err) {
        var shares = 0
      }

      postArray.push({
        "id": dataParsed.data[u].id,
        "message": dataParsed.data[u].message,
        "createdTime": dataParsed.data[u].created_time,
        "fullPicture": dataParsed.data[u].full_picture,
        "reactions": reactions,
        "comments": comments,
        "shares": shares
      })
}

【问题讨论】:

  • dataParsed 是否已经被解析(就像名字所暗示的那样),或者没有?如果是,为什么还要JSON.parse?如果不是,您不应该只解析第一部分——顶层的 JSON 字符串(即JSON.parse(dataParsed).data[u].comments.summary.total_count)吗?
  • 向我们展示dataParsed 的外观以获得更好的答案。特别是,如果它已经是一个对象,或者仍然是一个字符串。

标签: javascript try-catch default-value short-circuiting


【解决方案1】:

您可以使用&amp;&amp; (short circuiting) 和|| (default vlaue)

var reactions = dataParsed && dataParsed.data[u] &&  dataParsed.data[u].reactions && dataParsed.data[u].reactions.summary && dataParsed.data[u].reactions.summary.total_count || 0

optional chainingNullish Coalescing 有一个提案

var reactions = dataParsed?.data[u]?.reactions?.summary?.total_count ?? 0

【讨论】:

  • 鉴于 OP 是 var reactions = JSON.parse(...),如果默认值是有效的 JSON 可能会更好,否则您只是将一个错误更改为另一个错误。 ;-)
【解决方案2】:

制作一个函数:

function safeParse(propStr) {
  let r = 0;
  try {
    r = propStr.split(/\.|\[|\]/g).reduce((a, c) => a[c], {});
  } catch(e) {}
  return r;
}

var reactions = safeParse("dataParsed.data[u].reactions.summary.total_count");
var comments = safeParse("dataParsed.data[u].comments.summary.total_count");
var shares = safeParse("dataParsed.data[u].shares.count");

【讨论】:

    【解决方案3】:

    只需使用value|0 通过二元运算来捕获值。如果value存在,则返回value,否则返回0

    【讨论】:

    • 除非 value 恰好是一个有用的虚假值,例如 nullfalse。 ;-)
    • 哦,是的,这是一个很好的观点。在那种情况下,这样一个简短的解决方案可能是不可能的:/
    猜你喜欢
    • 2018-10-11
    • 2017-09-03
    • 2020-02-13
    • 2021-01-25
    • 2020-07-31
    • 2011-03-28
    • 2018-12-19
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多