51 lines
1.2 KiB
OCaml
51 lines
1.2 KiB
OCaml
type t = Json_type.t
|
|
open Json_type
|
|
|
|
|
|
let filter_result x =
|
|
Browse.assert_object_or_array x;
|
|
x
|
|
|
|
|
|
let check_channel_is_utf8 ic =
|
|
let start = pos_in ic in
|
|
let encoding =
|
|
try
|
|
let c1 = input_char ic in
|
|
let c2 = input_char ic in
|
|
let c3 = input_char ic in
|
|
let c4 = input_char ic in
|
|
Json_lexer.detect_encoding c1 c2 c3 c4
|
|
with End_of_file -> `UTF8 in
|
|
if encoding <> `UTF8 then
|
|
json_error "Only UTF-8 encoding is supported";
|
|
(try seek_in ic start
|
|
with _ -> json_error "Not a regular file")
|
|
|
|
(* from_channel and from_channel4 work
|
|
only on seekable devices (regular files) *)
|
|
let from_channel p recursive file ic =
|
|
check_channel_is_utf8 ic;
|
|
let lexbuf = Lexing.from_channel ic in
|
|
Json_lexer.set_file_name lexbuf file;
|
|
let j =
|
|
Json_parser.main
|
|
(Json_lexer.token p)
|
|
lexbuf
|
|
in
|
|
if recursive then j
|
|
else filter_result j
|
|
|
|
let load_json
|
|
?allow_comments ?allow_nan ?big_int_mode ?(recursive = false)
|
|
file =
|
|
let ic = open_in file in
|
|
let x =
|
|
let p =
|
|
Json_lexer.make_param ?allow_comments ?allow_nan ?big_int_mode () in
|
|
try `Result (from_channel p recursive file ic)
|
|
with e -> `Exn e in
|
|
close_in ic;
|
|
match x with
|
|
`Result x -> x
|
|
| `Exn e -> raise e
|