Not quite as bad as XML.. I think the problem is more the verbose, overly-nested format that was chosen for MathML than XML itself though.
{
"mrow": {
"mi": [ "x", "=" ],
"mfrac": {
"mrow": {
"mi": [ "−", "b", "±" ],
"msqrt": {
"mrow": {
"msup": {
"mi": [ "b", "2" ]
},
"mi": [ "−", "4ac" ]
}
}
},
"mi": "2a"
}
}
}JSON is great at many things, but polymorphic substructures are AFAIK only really possible with everything being an object defining the "type" that it is. And that looks significantly uglier than what you have above:
{
"type": "mrow",
"children": [
{
"type": "mi",
"identifier": "x"
},
{
"type": "mo",
"operator": "="
},
{
"type": "mfrac",
"rows": [
{
"type": "mrow",
"children": [
{
"type": "mo",
"operator": "-"
},
{
"type": "mi",
"identifier": "b"
},
{
"type": "mo",
"operator": "±"
},
{
"type": "sqrt",
"expression": {
"type": "mrow",
"children": [
{
"type": "mi",
"identifier": "b"
},
{
"type": "msup",
"expression": {
"type": "mi",
"identifier": 2
}
},
{
"type": "mo",
"operator": "-"
},
{
"type": "mi",
"identifier": "4ac"
}
]
}
}
]
},
{
"type": "mi",
"identifier": "2a"
}
]
}
]
} { "mrow": [
{ "mi": "x" },
{ "mo": "=" },
{ "mfrac": [
{ "mrow": [
{ "mo": "-" },
{ "mi": "b" },
{ "mo": "±" },
{ "sqrt": {
{ "mrow": [
{"mi": "b"},
{"msup": { "mi": 2 }},
{"mo": "-"},
{"mi", "4ac"}
]}
}}
},
{ "mrow": [
{"mi": "2a"}
]}
]}
}
It's not as general, but works if you know your syntax is similarly bounded. I don't know how certain static languages would handle serial/deserializing, but makes construction via javascript literals much more pleasant. (mrow (mi x)
(mo =)
(mfrac (mrow (mo -) (mi b) (mo ±)
(sqrt (mrow (mi b) (msup (mi 2)) (mo -) (mi 4ac))))
(mrow (mi 2a))))
And this would be a saner one, where mrow is implied: ((mi x) (mo =) (mfrac ((mo -) (mi b) (mo ±)
(sqrt (mi b) (msup (mi 2)) (mo -) (mi 4ac)))
(mi 2a)))
I think either of those is clearly and inarguably superior.Basically the problem is this: Either you explicitly represent the grouping in a general scheme capable of it, then you get the disaster (from the point of view of human readable and manipulable) that is XML or JSON. Or you use a domain specific language like LaTeX or whatever, with the attended parsing issues,etc.
If you want people to edit it by hand, the latter option is much better - but it has it's pain points. You don't get to use a broad range of robust tools to manipulate them, for one thing.