Gibt es eine XSLT Äquivalent für JSON? Etwas, das es mir ermöglicht, JSON so zu transformieren, wie XSLT es bei XML tut.
Antworten
Zu viele Anzeigen?Ich habe kürzlich ein Tool gefunden, das ich für die Gestaltung von JSON liebe: https://github.com/twigkit/tempo . Ein sehr einfach zu verwendendes Tool, das meiner Meinung nach viel einfacher zu handhaben ist als XSLT, da keine XPATH-Abfragen erforderlich sind.
Werfen Sie einen Blick auf jsonpath-object-transform
Die Behauptung, dass ein Mangel an Werkzeugen auf einen Mangel an Bedarf schließen lässt, ist schlichtweg unlogisch. Das Gleiche gilt für die Unterstützung von X oder Y in Linux (Warum sollte man sich die Mühe machen, qualitativ hochwertige Treiber und/oder Spiele für ein so unbedeutendes Betriebssystem zu entwickeln? Und warum sollte man sich um ein Betriebssystem kümmern, für das die großen Spiele- und Hardwarefirmen nicht entwickeln?). Wahrscheinlich verwenden die Leute, die XSLT und JSON verwenden müssten, eine etwas triviale Lösung: Die Umwandlung von JSON in XML. Aber das ist nicht die optimale Lösung, oder?
Wenn Sie ein natives JSON-Format haben und es "wysywyg" im Browser bearbeiten wollen, wäre XSLT eine mehr als angemessene Lösung für das Problem. Tun, dass mit traditionellen Javascript-Programmierung kann ein Schmerz in den Arsch zu werden.
In der Tat habe ich eine "Steinzeit"-Ansatz für XSLT, mit Substring Parsing zu interpretieren einige grundlegende Befehle für Javascript, wie der Aufruf einer Vorlage, Prozess Kinder, etc. Sicherlich ist die Implementierung einer Transformations-Engine mit einem JSON-Objekt viel einfacher als die Implementierung eines vollwertigen XML-Parsers zum Parsen der XSLT. Das Problem ist, dass XML-Vorlagen zu verwenden, um ein JSON-Objekt zu transformieren, müssen Sie das XML der Vorlagen zu parsen.
Um ein JSON-Objekt in XML (oder HTML, oder Text oder was auch immer) umzuwandeln, müssen Sie sich die Syntax genau überlegen und wissen, welche Sonderzeichen Sie zur Kennzeichnung der Umwandlungsbefehle verwenden müssen. Andernfalls müssen Sie am Ende einen Parser für Ihre eigene benutzerdefinierte Templating-Sprache entwerfen. Nachdem ich diesen Weg gegangen bin, kann ich Ihnen sagen, dass das nicht schön ist.
Aktualisierung (12. November 2010): Nachdem ich ein paar Wochen an meinem Parser gearbeitet habe, konnte ich ihn nun optimieren. Vorlagen werden vorher geparst und Befehle werden als JSON-Objekte gespeichert. Transformationsregeln sind ebenfalls JSON-Objekte, während der Vorlagencode eine Mischung aus HTML und einer selbstgebastelten Syntax ähnlich dem Shellcode ist. Es ist mir gelungen, ein komplexes JSON-Dokument in HTML umzuwandeln, um einen Dokumenteneditor zu erstellen. Der Code umfasst etwa 1.000 Zeilen für den Editor (für ein privates Projekt, so dass ich ihn nicht weitergeben kann) und etwa 990 Zeilen für den JSON-Transformationscode (einschließlich Iterationsbefehlen, einfachen Vergleichen, Vorlagenaufrufen, Variablenspeicherung und -auswertung). Ich plane, es unter einer MIT-Lizenz zu veröffentlichen. Schicken Sie mir eine Mail, wenn Sie sich beteiligen wollen.
Als weitere neue Antwort auf eine alte Frage empfehle ich einen Blick auf DefiantJS . Es ist kein XSLT gleichwertig für JSON, es est XSLT für JSON. Der Abschnitt "Templating" in der Dokumentation enthält dieses Beispiel:
<!-- Defiant template -->
<script type="defiant/xsl-template">
<xsl:template name="books_template">
<xsl:for-each select="//movie">
<xsl:value-of select="title"/><br/>
</xsl:for-each>
</xsl:template>
</script>
<script type="text/javascript">
var data = {
"movie": [
{"title": "The Usual Suspects"},
{"title": "Pulp Fiction"},
{"title": "Independence Day"}
]
},
htm = Defiant.render('books_template', data);
console.log(htm);
// The Usual Suspects<br>
// Pulp Fiction<br>
// Independence Day<br>
Jetzt schon! Ich habe kürzlich eine Bibliothek erstellt, json-transforms genau zu diesem Zweck:
https://github.com/ColinEberhardt/json-transforms
Es verwendet eine Kombination aus JSPath , einer DSL nach dem Vorbild von XPath, und einem rekursiven Pattern-Matching-Ansatz, der direkt von XSLT inspiriert ist.
Hier ist ein kurzes Beispiel. Gegeben sei das folgende JSON-Objekt:
const json = {
"automobiles": [
{ "maker": "Nissan", "model": "Teana", "year": 2011 },
{ "maker": "Honda", "model": "Jazz", "year": 2010 },
{ "maker": "Honda", "model": "Civic", "year": 2007 },
{ "maker": "Toyota", "model": "Yaris", "year": 2008 },
{ "maker": "Honda", "model": "Accord", "year": 2011 }
]
};
Hier ist eine Umwandlung:
const jsont = require('json-transforms');
const rules = [
jsont.pathRule(
'.automobiles{.maker === "Honda"}', d => ({
Honda: d.runner()
})
),
jsont.pathRule(
'.{.maker}', d => ({
model: d.match.model,
year: d.match.year
})
),
jsont.identity
];
const transformed = jsont.transform(json, rules);
Welche Ausgabe der folgenden:
{
"Honda": [
{ "model": "Jazz", "year": 2010 },
{ "model": "Civic", "year": 2007 },
{ "model": "Accord", "year": 2011 }
]
}
Diese Transformation setzt sich aus drei Regeln zusammen. Die erste passt zu jedem Auto, das von Honda hergestellt wird und ein Objekt mit einem Honda
Eigenschaft, dann rekursiv passend. Die zweite Regel passt auf jedes Objekt mit einer maker
Eigenschaft, die Ausgabe der model
y year
Eigenschaften. Die letzte ist die Identitätstransformation, die rekursiv passt.
1 Stimmen
Übrigens, in welcher Sprache/Plattform soll das geschehen?
9 Stimmen
@StaxMan XSLT ist ein Standard, der in vielen Sprachen und Plattformen implementiert ist, und meine Fragen zielen auf ein ähnliches Vorhaben ab.
0 Stimmen
Ja, aber auch wenn es keine exakte Entsprechung zu geben scheint, könnte es für eine Teilmenge von Sprachen anwendbare Werkzeuge geben, die helfen könnten.
57 Stimmen
+1 für Ihre Frage. Viele Leute scheinen XSLT zu übersehen oder schlichtweg nicht zu mögen, aber das kann einfach eine Reaktion auf die Ausführlichkeit von XML sein. Und in der Tat, da XML allmählich in Ungnade fällt, gibt es immer weniger Gelegenheiten, XSLT zu verwenden, was sehr schade ist! Ein XSLT-Äquivalent für JSON wäre großartig.
13 Stimmen
@NicolasLeThierryd'Ennequin Einverstanden. Viele Leute hassen XML und lehnen daher XSLT ab. Das XML-Ökosystem der Tools ist auch stark auf Java-Entwickler ausgerichtet, was noch mehr Leute abschreckt. Aber ich habe mich Mitte der 2000er Jahre intensiv mit XSLT beschäftigt, und es gibt eine enorme Leistungsfähigkeit, die keine direkte Entsprechung außerhalb des XML-Ökosystems hat. Ich würde Liebe ein JSON-Äquivalent!
0 Stimmen
Was XSLT jedoch so großartig machte, waren andere XML-Standards, auf denen es aufbaute. Insbesondere: (1) die Möglichkeit, ein XML-Dokument mit einem Schema zu validieren (nicht erforderlich, aber oft verwendet), und (2) XPath, mein Favorit immer Sprache für die Navigation in Datenhierarchien. Jedes solide XSLT-Äquivalent für JSON würde gut daran tun, diese Dinge ebenfalls zu berücksichtigen.
1 Stimmen
@NicolasLeThierryd'Ennequin : siehe jsfiddle.net/YSharpLanguage/kj9pk8oz/10 o jsfiddle.net/YSharpLanguage/ppfmmu15/10 o jsfiddle.net/YSharpLanguage/hvo24hmk/3
0 Stimmen
@Zearin: OP könnte vernünftigerweise erwarten, dass jeder, der in der Lage ist, diese Frage zu beantworten, weiß, dass ein XSLT-Analogon auf einem XPath-Analogon aufbauen muss (obwohl das XPath-Analogon nicht notwendigerweise einen eigenen Namen hat, wie es XPath hat).
1 Stimmen
@BhargavRao Ich stimme zu, dass dies geschlossen werden sollte, aber ich denke, dass der Grund für die Empfehlung besser wäre, da wir aufgefordert werden, einen Standard oder ein Werkzeug zu benennen, das vielleicht oder vielleicht auch nicht existiert, anstatt einen Code zu suchen.
1 Stimmen
ANTWORT: Ja, das stimmt: Siehe JSON-Abzeichen . Es handelt sich um eine vorgeschlagene Norm ( RFC 6902 ).
0 Stimmen
Für C#/.NET gibt es eine Bibliothek, die JSON-Transformationen durchführen kann: "JUST - JSON Under Simple Transformation (XSLT equivalent for JSON)". github.com/WorkMaze/JUST.net
0 Stimmen
Link Versuchen Sie bitte, xslt in json zu konvertieren
5 Stimmen
Ich bin mit dem Schluss dieser Antwort überhaupt nicht einverstanden. Eine einfache Umformulierung hätte ausgereicht: "Wie kann man JSON deklarativ in JSON umstrukturieren?"
0 Stimmen
Diese Frage ist so abgeschlossen und objektiv, dass wir sie meiner Meinung nach wieder öffnen können. Technisch gesehen handelt es sich um eine Frage nach einem Werkzeug, aber sie ist von ganz anderer Natur als die typische Frage, die aus diesem Grund geschlossen wird.
1 Stimmen
Warum nicht
JSON -convert-> XML -XSLT-> XML -convert-> JSON
? Die Konvertierung von JSON nach XML ist nur eine Wahl, wie man ein strukturiertes Format in ein anderes strukturiertes Format umwandelt. , dann XSLT anwenden und schließlich zurückkonvertieren. Da Sie gewählt haben, wie das XML nach der Konvertierung in XML aussieht, sollte die Rückkonvertierung in diesem Fall einfach sein (es gibt wahrscheinlich keine gute Möglichkeit, einen "beliebigen XML-zu-JSON"-Konverter zu erstellen, da es zu viele Möglichkeiten gibt, etwas in XML auszudrücken, während JSON ziemlich festgelegt ist, wie Dinge serialisiert werden).