Yojson для разбора int64 (ocaml)

Насколько я понимаю, это {"xxx": 1000000000000000} верно?

Не знаю, как разобрать его с помощью Yojson.Safe. Я ищу что-то вроде _ `Int64 из int64 _ , но ничего не предоставлено, есть только _ `Int из int _ и _ `Intlit из строки _ в API.

Изменить, это моя проблема

let x = "{\"xxx\": 10000000000000}"
let json = Yojson.Safe.from_string x
match json with `Assoc [("xxx", `Intlit yyy)] -> yyy | _ -> assert false

Он не будет совпадать, потому что тип json

val json : Yojson.Safe.json = `Assoc [("xxx", `Int 10000000000000)]

person romerun    schedule 07.03.2014    source источник


Ответы (1)


Кажется, Yojson возвращает Int, если он подходит для OCaml int и `Intlit в противном случае, поэтому вам нужно обрабатывать все случаи:

match json with 
| `Assoc [("xxx", `Intlit lit)] -> Int64.of_string lit
| `Assoc [("xxx", `Int i)] -> Int64.of_int i
person Daniel Bünzli    schedule 07.03.2014
comment
Хорошо, полностью изменил мой ответ. - person Daniel Bünzli; 07.03.2014
comment
А, понятно, Yojson.Safe преобразует это в Intlit if the number is bigger than Int. Это то, что я пропустил. - person romerun; 08.03.2014