Fixpoint jsonSerialize (j : json) : list jsonToken :=
  match j with
  | JsonBoolean true  => [JTTrue]
  | JsonBoolean false => [JTFalse] 
  | JsonInteger n     => [JTInteger n]
  | JsonFloat         => [JTFloat]
  | JsonString s      => [JTString s]
  | JsonObject o      =>
    let props := map (fun p => JTString (fst p) :: JTEquals :: jsonSerialize (snd p)) o in
      JTObjectStart :: (jsonComma props) ++ [JTObjectEnd]
  | JsonArray a       =>
    let values := map jsonSerialize a in
      JTArrayStart :: (jsonComma values) ++ [JTArrayEnd]
  end.
