[Haskell-cafe] Haskell, successing crossplatform API standart

Richard O'Keefe ok at cs.otago.ac.nz
Thu Dec 18 19:18:21 EST 2008

On 18 Dec 2008, at 7:41 pm, Belka wrote:
> Oh, but JSON doesn't seem to support tree-structured data...

Sure it does.  In Haskell terms,

data JSON
    = JSON_Number Double   -- not entirely clear, actually
    | JSON_String String   -- Unicode
    | JSON_Array  [JSON]   -- order matters
    | JSON_Object [(String,JSON)]  -- Unicode keys, order no matter

It supports trees well enough that encoding XML as JSON is trivial.
To a first approximation,

data XML
    = XML_CData String
    | XML_Element String [(String,String)] [XML]


xml_to_json (XML_CData s) =
     JSON_String s
xml_to_json (XML_Elment name atts children) =
     JSON_Object [("n", JSON_String name),
                  ("a", JSON_Object [(k,JSON_STRING v) | (k,v) <-  
                  ("c", JSON_Array (map xml_to_json children))]

One can handle the other aspects of XML, I just couldn't be bothered.
Converting JSON that represents XML to XML is straightforward.

Of course the converse is true too.

json_to_xml (JSON_Number x) =
     XML_Element "n" [] XML_CData (show x)
json_to_xml (JSON_String s) =
     XML_Element "s" [] XML_CData s
json_to_xml (JSON_Array  a) =
     XML_Element "a" [] map json_to_xml a
json_to_xml (JSON_Object o) =
     XML_Element "o" []
       [XML_Element "e" [("k",k)] (json_to_xml v) | (k,v) <- o]

Again, converting XML that represents JSON to JSON is straightward,
I just don't need to show it to make the point.
Also obviously, you might as well use Lisp s-expressions.

If you have a choice between XML and JSON, it may be worth remembering
that JSON is *far* easier to parse.  I would expect a JSON parser to
be faster, and more importantly, I would expect it to be more reliable.

More information about the Haskell-Cafe mailing list