2 ms·
What you have doesn't work. What if I have "mi, mo, mfrac, mo, mi" at the top level? So something like "a - b/c + d". You can't specify the same key twice in JS
by jdmichal 11y ago
What you have doesn't work. What if I have "mi, mo, mfrac, mo, mi" at the top level? So something like "a - b/c + d". You can't specify the same key twice in JSON. Also, keys are technically unordered, so there's no guarantee that a parser will put that top-level "mi" before the "mfrac".
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"
}
]
}
]
}
- roller 11y agoWhile this format is more generic, an abbreviated encoding can sometimes accomplish the same thing. For example, just moving the "type" to be the object key and removing the implied secondary name gets you this far: { "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.
- jdmichal 11y agoSure, that works as long as each type only has one property. Decoding it might be problematic; I don't know any serializers that would handle that kind of mapping natively.
- wtbob 11y agoFWIW, this would be a literal s-expression translation: (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.