首页 > 解决方案 > 从 json 文件中获取项目的行数和列数

问题描述

我正在创建一个打字稿库来针对一些自定义约束验证 JSON 文件,例如我有这个 json 文件:

[
  {
    "nodes": [
      {
        "id": 1,
        "name": "node 1"
      },
      {
        "id": 1, // <--- here needs to throw an error because of duplicate ids
        "name": "node 2"
      }
    ],

    "edges": [
      {
        "id": 1,
        "nodeId": 1,
        "name": "edge 1"
      },
      {
        "id": 2,
        "nodeId": 3, // <--- here needs to throw an error because of node id does not exist
        "name": "edge 1"
      }
    ]
  }
]

我已经用json shcema它来验证 json 的结构(如required属性、类型......)。

使用打字稿,我可以轻松地循环抛出 2 个列表并找到错误,但问题是我无法获取该错误的位置(line& column),所以有没有办法为我的错误获取行号?如果不可能,那么是否有另一种方法可以为用户返回有用的错误?

标签: javascriptjsontypescript

解决方案


行号和列号将非常复杂,您必须为此推出自己的 JSON 解析器,因为库存JSON.parse不保留此信息。

更现实的选择是在验证时维护一堆密钥,并为用户提供诸如“节点处的错误 xyz -> 项目 5 -> someKey”之类的信息。例子:

json = {
    foo: [
        1,
        2,
        {
            bar: {
                baz: 'error!'
            }
        }
    ]
}

function validate(obj, stack = []) {
    if (Array.isArray(obj))
        obj.forEach((v, n) => validate(v, stack.concat('index ' + n)))
    else if (typeof obj === 'object')
        Object.entries(obj).forEach(([k, v]) => validate(v, stack.concat(k)))
    else if (obj === 'error!')
        console.log('ERROR at ' + stack.join(' -> '))
}

validate(json)


推荐阅读