从源中的 JSON 令牌获取位置信息

ano*_*nol 3 json ocaml

我正在使用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)

下降范围!