首页 > 解决方案 > 检查 JSON 对象是否符合预期模式的最轻量级方法是什么?

问题描述

这似乎是一种常见的乏味模式:

function handleResponse(httpResponseBody) {
  const body = JSON.parse(httpResponseBody);
  if (body.someField &&
      body.someField.length >= 5 &&
      body.someField[4].otherField &&
      body.someField[4].otherField.finalField) {
    /* ... do something with finalField ... */
  }
}

有点做作,但关键是如何避免像这样的样板验证逻辑,如果您只是要通过手术访问对象的某些部分并希望最小化验证该部分的结构为预期的?轻量级的东西,概念上很简单:

function handleResponse(httpResponseBody) {
  const body = JSON.parse(httpResponseBody);
  if (validate(body, '{ someField[>=5].otherField.finalField }') {
    /* ... safe to access body.someField[4].otherField.finalField directly ... */
  }
}

或者可能:

function handleResponse(httpResponseBody) {
  const body = JSON.parse(httpResponseBody);
  const finalField = access(body, '{ someField[4].otherField.finalField }');
  if (finalField) {
    /* ... */
  }
}

标签: javascriptjsonjsonschema

解决方案


为子孙后代解答。基于https://github.com/tc39/proposal-optional-chaining并在当前的 TypeScript 和 Babel 插件中可用。

您可以使用可选链接。

const finalField = body.someField?.[4]?.otherField?.finalField;

if (finalField) {
    /* ... do something with finalField ... */
}

推荐阅读