2012-04-29 20:34:08 +00:00
|
|
|
open Sexp
|
|
|
|
|
|
|
|
let rec sexp_of_json j =
|
|
|
|
match j with
|
2012-05-28 13:34:14 +00:00
|
|
|
| Json.Num f -> Hint {hint = "num"; body = Json.to_string j}
|
2012-04-29 20:34:08 +00:00
|
|
|
| Json.Str s -> Str s
|
|
|
|
| Json.Arr js -> Arr (List.map sexp_of_json js)
|
2012-05-28 13:34:14 +00:00
|
|
|
| Json.Rec kvs -> Arr ((Hint {hint = "obj"; body = ""}) ::
|
|
|
|
(List.map (fun (k, v) -> Arr [Str k; sexp_of_json v]) kvs))
|
|
|
|
| Json.Flg f -> Hint {hint = "bool"; body = string_of_bool f}
|
|
|
|
| Json.Nil -> Hint {hint = "null"; body = ""}
|
2012-04-29 20:34:08 +00:00
|
|
|
|
2012-05-07 10:31:59 +00:00
|
|
|
let json_of_sexp x =
|
|
|
|
let rec walk x =
|
|
|
|
match x with
|
2012-05-28 13:34:14 +00:00
|
|
|
| Hint {hint = "num"; body = n} -> Json.Num (float_of_string n)
|
2012-05-07 10:31:59 +00:00
|
|
|
| Str s -> Json.Str s
|
2012-05-28 13:34:14 +00:00
|
|
|
| Arr ((Hint {hint = "obj"; body = ""}) :: kvs) ->
|
2012-05-07 10:31:59 +00:00
|
|
|
Json.Rec (List.map
|
|
|
|
(fun kv ->
|
|
|
|
(match kv with
|
|
|
|
| Arr [Str k; v] -> (k, walk v)
|
|
|
|
| _ -> raise (Syntax_error "Bad JSON-SEXP key-value")))
|
|
|
|
kvs)
|
2012-05-28 13:34:14 +00:00
|
|
|
| Arr xs -> Json.Arr (List.map walk xs)
|
|
|
|
| Hint {hint = "bool"; body = bs} -> Json.Flg (bool_of_string bs)
|
|
|
|
| Hint {hint = "null"; body = ""} -> Json.Nil
|
|
|
|
| Hint {hint = h; body = b} -> Json.Rec ["_hint", Json.Str h; "_body", Json.Str b]
|
2012-05-07 10:31:59 +00:00
|
|
|
in
|
|
|
|
Lwt.wrap1 walk x
|