# HG changeset patch # User Adam Chlipala # Date 1291310850 18000 # Node ID 8f7396495045cb3d429f93cd52b6e2d2e7ece95b # Parent 189245a3c075de054976e958e100c1b2cead17ab JSON nulls diff -r 189245a3c075 -r 8f7396495045 json.ur --- a/json.ur Thu Dec 02 12:17:51 2010 -0500 +++ b/json.ur Thu Dec 02 12:27:30 2010 -0500 @@ -140,6 +140,19 @@ else error JSON: bad boolean string: {[s]}} +fun json_option [a] (j : json a) : json (option a) = + {ToJson = fn v => case v of + None => "null" + | Some v => j.ToJson v, + FromJson = fn s => if String.isPrefix {Full = s, Prefix = "null"} then + (None, String.substring s {Start = 4, Len = String.length s - 4}) + else + let + val (v, s') = j.FromJson s + in + (Some v, s') + end} + fun json_list [a] (j : json a) : json (list a) = let fun toJ' (ls : list a) : string = diff -r 189245a3c075 -r 8f7396495045 json.urs --- a/json.urs Thu Dec 02 12:17:51 2010 -0500 +++ b/json.urs Thu Dec 02 12:27:30 2010 -0500 @@ -10,6 +10,7 @@ val json_int : json int val json_float : json float val json_bool : json bool +val json_option : a ::: Type -> json a -> json (option a) val json_list : a ::: Type -> json a -> json (list a) val json_record : ts ::: {Type} -> folder ts -> $(map json ts) -> $(map (fn _ => string) ts) -> json $ts