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

时间:2018-01-24 12:50:37

标签: json ocaml

我正在使用yojson来解析OCaml中的JSON文件,当我验证输入文件时,我想发出包含用户源代码信息的错误消息。

例如,如果我发现第5492行的给定值不在允许的范围内,我想告诉用户:“行source.json中的值无效:5492”。

如何获取此信息?

(如果yojson无法提供此类信息,则另一个拥有此信息的OCaml JSON库可能会有用。)

1 个答案:

答案 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

放弃范围!