Es gibt einen extrem hartnäckigen Bug in net.sf.json.xml.XMLSerializer: Ein XML-Knoten
1 |
<foobar>[]</foobar> |
wird nicht zum String
1 |
{foobar:"[]"} |
sondern zum leeren Array
1 |
{foobar:[]} |
Jetzt könnte man vermuten, dass CDATA hilft, oder HTML-Sonderzeichen, oder Escapen, oder oder oder. Alles falsch. Der Serializer ist so “klug”, dass er alles trimt optimiert und ersetzt, bis er wieder den ursprünglichen String findet, und der Bug zuschlägt. Das meine ich mit “hartnäckig 🙂
Einzige Lösung, die mir eingefallen ist (Verbesserungen werden gerne gesehen!):
1 2 3 4 5 |
String xml = "<foobar>[]</foobar>"; xml = org.apache.commons.lang.StringUtils.replace(xml, ">[]<", ">"[]"<"); xml = org.apache.commons.lang.StringUtils.replace(xml, ">{}<", ">"{}"<"); final XMLSerializer xmlSerializer = new XMLSerializer(); final JSON json = xmlSerializer.read(xml); |
PS: Das ist deshalb geringfügig weniger dirty, als es aussieht, weil spitze Klammern Teil des Suchstrings sind. Spitze nicht-escapte Klammern dürfen in (validen) XMLs nur Teil der Struktur sein, deshalb werden hier tatsächlich nur Knoteninhalte, die ausschließlich “[]” lauten, ersetzt.
PPS: Ein ähnliches Problem gibt es mit
1 |
<foobar>{}</foobar> |
aus dem ein Object wird. Ich ersetze es deshalb einfach analog, siehe oben.