【发布时间】:2022-01-09 17:35:03
【问题描述】:
给定一个 JSON 文件和一个键的路径,我需要能够获取存储值的行号。在我弄清楚如何处理最简单的情况之前,需要多行的值(例如数组)目前不在范围内。例如,在以下 JSON 中:
{ # Line 1
"foo": { # Line 2
"bar": [
"value1",
"value2"
],
"bar2": 2 # Line 7
},
"bar": {
"bar": [
"value1",
"value2"
],
"bar2": 5
}
}
在查找密钥路径 foo.bar2 时,我应该得到 7。
假设原始文件的格式为JSON.pretty_generate,我有一个可行的解决方案:
parsed_json = File.read(file)
random_string = SecureRandom.uuid
parsed_json.bury(*path.split('.'), random_string)
JSON.pretty_generate(parsed_json)
.split("\n")
.take_while { |s| s.exclude? random_string }
.count + 1
我在这里所做的是解析 JSON 文件,用随机字符串(在本例中为 UUID)替换现有值,将散列格式化为漂亮打印的 JSON,并找到存在随机字符串的行。此处使用的Hash.bury 方法按照https://bugs.ruby-lang.org/issues/11747 中的定义工作。
此解决方案运行良好(但尚未经过大量测试),但当原始文件未格式化为打印精美的 JSON 时,我正在努力使其工作。例如,以下文件将等同于上述文件:
{ # Line 1
"foo": { # Line 2
"bar": ["value1","value2"],
"bar2": 2 # Line 4
},
"bar": {
"bar": [
"value1",
"value2"
],
"bar2": 5
}
}
但是上面的算法仍然会返回7作为foo.bar2所在的行,虽然现在它在4行中。
有什么方法可以可靠地获取 JSON 文件中密钥所在的行号?
【问题讨论】:
-
在漂亮打印的输入或输出上使用 grep。解析后,JSON 并没有真正的行号。不过,文件和输出可以。
标签: json ruby jsonparser