【问题标题】:Get line and column number of items from a json file从 json 文件中获取项目的行数和列数
【发布时间】:2021-09-10 12:22:53
【问题描述】:

我正在创建一个 typescript 库来针对一些自定义约束验证 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 个列表并找到错误,但问题是我无法获取该错误的位置(linecolumn)所以有没有办法获取行号我的错误?如果不可能,还有其他方法可以为用户返回有用的错误吗?

【问题讨论】:

标签: javascript json typescript


【解决方案1】:

行号和列号会非常复杂,您必须为此推出自己的 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)

【讨论】:

  • 好的,所以由用户在 json 文件中搜索错误消息对吗?同样,当我在搜索时,我遇到了 AST(抽象语法树),它标记了 json 文件并给出了每个项目的位置,但生成树的遍历很复杂,而且我不知道这是否会扩大规模json 文件...所以您的解决方案似乎可以解决问题,但只是想确定 AST 是否是一个好主意?
  • 从长远来看,AST 更好,而且肯定对用户更友好,但正如我所说,您需要为此编写自己的 json 解析器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多