JSON Object effizient durchsuchen/auswerten

06/11/2013 - 14:25 von Alex | Report spam
Hi,

ich habe ein XML-File in ein JSON Objekt konvertiert. Dem Objekt fehlen natürlich jegliche Zugriffsmethoden.

JSONObject[key1][key2]... ist da natürlich recht umstàndlich in der Adressierung; gerade bei einem großen Objekt, das unterschiedlich tief gegliedert ist.

Mit

for ( var key in JSONObject ) {
if (JSONObject[key] instanceof Object) {
...
}
else {
...
}

wird es durch die unterschiedliche Tiefe auch schwer. Gibt es einen effizienten Algorithmus für JSONObjecte? Google konnte mir auch mit intensiver Suche nicht weiterhelfen :-(

VG
Alex
 

Lesen sie die antworten

#1 Thomas PointedEars Lahn
06/11/2013 - 17:12 | Warnen spam
Alex wrote:
^^^^
Bitte Nachname ergànzen, Alex Nr. 4711.

ich habe ein XML-File in ein JSON Objekt konvertiert.



Ein hàufiges Missverstàndnis. Es gibt keine „JSON-Objekte“ ausser „JSON“,
dem in ECMAScript Ed. 5 vordefinierten Objekt (mit den Methoden JSON.parse()
und JSON.stringify()).

JSON ist die JavaScript Object *Notation*, also ein zu ECMAScript
kompatibles Klartext-*Datenformat*; genau wie auch XML ein Datenformat ist.
Man spricht deshalb auch von XML-_Dokumenten_, XML-_Daten_ oder XML-
_Ressourcen_; nicht “XML-Files”.

<http://json.org/>

Dem Objekt fehlen natürlich jegliche Zugriffsmethoden.



Die in ECMAScript-Implementierungen aus JSON mittels Parsing erzeugten
Objekte sind Object- oder Array-Instanzen und haben daher jede Menge
Zugriffsmethoden, die sie von Object.prototype und Array.prototype erben.
Zusàtzlich enthàlt ECMAScript Ed. 5 Elemente der Metaprogrammierung wie die
Methoden von Object (z. B. Object.getOwnPropertyNames()).

JSONObject[key1][key2]... ist da natürlich recht umstàndlich in der
Adressierung; gerade bei einem großen Objekt, das unterschiedlich tief
gegliedert ist.

Mit

for ( var key in JSONObject ) {
if (JSONObject[key] instanceof Object) {
...
}
else {
...
}

wird es durch die unterschiedliche Tiefe auch schwer.



Je nachdem, was Du vorhast (Beispiel?) ist es ausserdem der fhcsale Ansatz.
Du brauchst nicht über Objekteigenschaften iterieren, wenn Du die Namen der
Eigenschaften bereits kennst.

Gibt es einen effizienten Algorithmus für JSONObjecte? Google konnte mir
auch mit intensiver Suche nicht weiterhelfen :-(



Erstmal solltest Du Dir klar werden, was Du erreichen willst. Dann fàllt
auch die Google-Suche leichter.

Falls Du nur auf „verschachtelte“ Objekte zugreifen willst, findest Du mit
jsx.object.getFeature() in JSX:object.js (Freie Software, GPLv3-lizensiert)
findest Du einen solchen Algorithmus implementiert:

/**
* Returns a feature of an object
*
* @param {Object} obj
* Object which provides the feature
* @params {string}
* Property names on the feature path, including the property
* for the feature itself. For example, use
* <code>jsx.object.getFeature("foo", "bar", "baz")</code> for
* safe access to <code>foo.bar.baz</code>.
* @return {any}
* <code>undefined</code> if <var>obj</var> does not have such
* a feature. Note that features whose value can be
* <code>undefined</code> cannot be detected with this method.
*/
getFeature: function (obj) {
for (var i = 1, len = arguments.length; i < len; i++)
{
var arg = arguments[i];
if (typeof obj != "undefined" && typeof obj[arg] != "undefined"
&& obj[arg])
{
obj = obj[arg];
}
else
{
return void 0;
}
}

return obj;
}

// …

var o = {foo: bar: {baz: 42}};

/* 42 */
var x = jsx.object.getFeature(o, "foo", "bar", "baz");

/* undefined */
var y = jsx.object.getFeature(o, "baz", "bar", "foo");

<http://Pointedears.de/wsvn/JSX/trunk/object.js>

In JSX verwende ich die Methode, um optionale Features, die von JSX-Modulen
oder der Laufzeitumgebung bereitgestellt werden, zu erkennen und zu nutzen.
Sie eignet sich _nicht_ dazu, Methoden von Objekten effizient zu erkennen
und zu nutzen; daran arbeite ich noch.

Bezüglich Auswertung solltest Du Dir LINQ anschauen. Für die vorhandenen
LINQ-Implementierungen in ECMAScript kann ich keine Bewertung abgeben. Ich
habe aber schon überlegt, so etwas in der Art zu implementieren. Ansàtze
dazu gibt es mit jsx.array.createComparator() und jsx.array.createFilter()
in JSX:array.js (unter derselben Lizenz). Die Rückgabewerte dieser Methoden
kann man dann Array.prototype.sort() und Array.prototype.filter() bzw.
Emulationen davon übergeben (so dass eine LINQ-Implementierung nur
“syntactic sugar” wàre).

<http://de.wikipedia.org/wiki/LINQ>

PointedEars

Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Ähnliche fragen