javascript - 从 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
),所以有没有办法为我的错误获取行号?如果不可能,那么是否有另一种方法可以为用户返回有用的错误?
解决方案
行号和列号将非常复杂,您必须为此推出自己的 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)
推荐阅读
- css - 更改内联 css 不会触发转换
- reactjs - 当我构建 docker 映像时,我想阻止在本地目录中安装 node_modules
- c++ - 编译 cocosBuilder 时的 Xcode 错误 - stdlib.h 中的未知类型名称 ldiv_t
- python - 在 `setter` 内置方法中添加 `return self.__num` 语句有什么区别吗?
- angular - Stackblitz VS Visual Studio?
- javascript - 通过动态属性从对象数组创建对象
- python - 为什么我们需要 Django 中的虚拟环境?
- google-distancematrix-api - Google Distance Matrix Api - 单位=英制时的奇怪问题
- python - 通过行索引将小数据框分配给大数据框
- mysql - 如何使用 PIVOT 编写此查询而不会出现“语法错误”