我正在使用yojson
来解析OCaml中的JSON文件,当我验证输入文件时,我想发出包含用户源代码信息的错误消息。
例如,如果我发现第5492行的给定值不在允许的范围内,我想告诉用户:“行source.json中的值无效:5492”。
如何获取此信息?
(如果yojson无法提供此类信息,则另一个拥有此信息的OCaml JSON库可能会有用。)
答案 0 :(得分:4)
在效率和交互性之间,Yojson
选择了第一个(更准确地说,Yojson
实际上是为数据(反)序列化而设计的,因此计算机生成的JSON,错误报告毫无意义)。 / p>
其杠杆文件:yojson/lib/read.mll
以确切的注释开头:
(*
We override Lexing.engine in order to avoid creating a new position
record each time a rule is matched.
This reduces total parsing time by about 31%.
*)
这些职位正是您报告错误所需要的!
Jsonm
具有您的需求:
val decoded_range : decoder -> (int * int) * (int * int)
decoded_range d is the range of characters spanning the last `Lexeme or `Error (or `White or `Comment for an Jsonm.Uncut.decode) decoded by d. A pair of line and column numbers respectively one and zero based.
但是Jsonm
是一个专家库。
可悲的是,它的包装器Ezjsonm
几乎是一件好事,但在最后一秒失败并提高了Ezjsonm.Parse_error
,没有范围!
您可以看一下源代码,作为在https://github.com/mirage/ezjsonm/blob/master/lib/ezjsonm.ml上做正确的事情的启发:json_of_src
完全可以满足您的需求,但是……出于未知的原因……{{1 }}定义为
from_src
放弃范围!