javascript - 检查 JSON 对象是否符合预期架构的最轻量级方法是什么?

标签 javascript json jsonschema

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

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 ... */
  }
}

有点做作,但重点是,如果您只是要通过手术访问对象的某些部分,并且希望最低限度地验证该部分,那么如何避免像这样的样板验证逻辑,而不对主体采用完整的 JSON 模式验证结构是否符合预期?一些轻量级的东西,概念上很简单:

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) {
    /* ... */
  }
}

最佳答案

最简单的方法是将其简单地包装在 try/catch block 中:

var data = {body: { someField: [0,0,0,0, { otherField: { finalField: 'test'}}]}};
try {
   var finalField = data.body.someField[4].otherField.finalField;
   console.log(finalField);
} catch(e) {
   console.error('Invalid');
}

try {
   var finalField = data.body.someField[7].otherField.finalField;
   console.log(finalField);
} catch(e) {
   console.error('Invalid');
}

您还可以使用ES6 destructuring再次使用 try/catch block :

try {
  var { body: { someField: [,,,,{ otherField: { finalField }}] }} = {body: { someField: [0,0,0,0, { otherField: { finalField: 'test'}}]}};

  console.log(finalField);
} catch(e) {
  console.error('Invalid');
}

try {
  var { body: { someField: [,,,,{ otherField: { finalField }}] }} = {body: { someField: [0,0,0, { otherField: { finalField: 'test'}}]}};
  console.log(finalField);
} catch (e) {
  console.error('Invalid');
}

如果你想使用点路径(例如“body.someField.4.otherField.finalField”你可以这样做:

var data = {body: { someField: [0,0,0,0, { otherField: { finalField: 'test'}}]}};
var finalField = 'body.someField.4.otherField.finalField'.split('.').reduce((o,i)=>o[i], data);
console.log(finalField);
try {
finalField = 'body.someField.7.otherField.finalField'.split('.').reduce((o,i)=> o[i], data);
console.log(finalField);
} catch(e) {
    console.error('Invalid');
}

关于javascript - 检查 JSON 对象是否符合预期架构的最轻量级方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057902/

相关文章:

javascript - Ruby on Rails/Javascript - 如何判断内容是否动态生成?

javascript - 为公共(public) API GET 请求构建 JQuery getJSON 的查询字符串

javascript - backbone.js 对不再使用的模型做了什么

javascript - KO找不到带ID的模板

javascript - 如何使用 json 响应中的值中的 img 源?

json - 验证 Node 中 swagger json.schema 的 POST 数据

json - Nodejs json-schema 无法读取架构

用于匹配不能包含某些字符或子字符串的字符串的正则表达式

javascript - 用js减去div宽度的一半

php - 可以使用 JSON 将数据存储在 mysql 数据库中吗?