我正在使用yojsonOCaml 解析 JSON 文件,在验证输入文件时,我想向用户发出包含源代码信息的错误消息。
例如,如果我发现第 5492 行的给定值不在允许的范围内,我想告诉用户:“source.json:5492 行中的值无效”。
我怎样才能得到这些信息?
(如果 yojson 无法提供此类信息,则另一个具有此信息的 OCaml JSON 库可能会很有用。)
小智 5
在效率和交互性之间,Yojson选择了第一个(更准确地说,Yojson它实际上是为数据(反)序列化而设计的,因此计算机生成 JSON,其中错误报告没有任何意义)。
它的杠杆文件: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%.
*)
Run Code Online (Sandbox Code Playgroud)
这些位置正是你需要报错的!
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.
Run Code Online (Sandbox Code Playgroud)
但它Jsonm是一个专家图书馆。
遗憾的是,它的包装器Ezjsonm几乎做了好事,但在最后一秒失败了,并且Ezjsonm.Parse_error在没有范围的情况下加注!
您可以在https://github.com/mirage/ezjsonm/blob/master/lib/ezjsonm.ml查看源代码作为做正确事情的灵感:json_of_src完全符合您的需要,但是...未知原因...from_src定义为
let from_src src =
match json_of_src src with
| `JSON t -> t
| `Error (_,e) -> parse_error `Null "JSON.of_buffer %s" (string_of_error e)
let from_string str = from_src (`String str)
Run Code Online (Sandbox Code Playgroud)
下降范围!
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |