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]

So,

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) <- atts]),
                 ("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.


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to