Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

JSON-Datei in Javascript verwenden

450 views
Skip to first unread message

Frank Faulstich

unread,
Mar 15, 2013, 8:56:51 AM3/15/13
to
Hallo Experten,

ich stehe momentan etwas auf dem Schlauch. Ich habe ein paar Daten in einer Datei im JSON-Format gespeichert. Die Datei ist lokal gespeichert.
In einem Javascript möchte ich nun auf diese Daten zugreifen. Die JSON-Datei sieht etwa so aus:

#####
{
"MeinProgramm1":"8.01.0016",
"MeinProgramm2":"5.01.0016"
}
#####

Diese Daten will ich in "jsontext" einlesen.

#####

[...]
var jsontext = ???;

var versions = JSON.parse(jsontext);
var VersionMeinProgamm1=document.createTextNode(versions.MeinProgramm1);
[...]

#####

Muss ich das wirklich mit XMLHttpRequest() machen oder geht das einfacher?

Viele Grüße
Frank

Thomas 'PointedEars' Lahn

unread,
Mar 15, 2013, 9:06:04 AM3/15/13
to
Frank Faulstich wrote:

> […] Ich habe ein paar Daten in einer Datei im JSON-Format gespeichert. Die
> Datei ist lokal gespeichert.
^^^^^^^^^^^^^^^^^
Das heisst?

> In einem Javascript

Es gibt kein „Javascript“, siehe auch <http://PointedEars.de/es-matrix>.

> möchte ich nun auf diese Daten zugreifen. Die JSON-Datei sieht etwa so
> aus:
>
> #####
> {
> "MeinProgramm1":"8.01.0016",
> "MeinProgramm2":"5.01.0016"
> }
> #####
>
> Diese Daten will ich in "jsontext" einlesen.
>
> #####
>
> [...]
> var jsontext = ???;
>
> var versions = JSON.parse(jsontext);

Bedenke, dass nicht jede ECMAScript-Implementierung das built-in hat.

> var VersionMeinProgamm1=document.createTextNode(versions.MeinProgramm1);
> [...]
>
> #####
>
> Muss ich das wirklich mit XMLHttpRequest() machen

Nein.

> oder geht das einfacher?

Ja. Ob das aber besser wäre, steht auf einem anderen Blatt.

--
PointedEars

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

Arno Welzel

unread,
Mar 15, 2013, 11:01:57 AM3/15/13
to
Am 15.03.2013 14:06, schrieb Thomas 'PointedEars' Lahn:

> Frank Faulstich wrote:
>
[...]
>> var versions = JSON.parse(jsontext);
>
> Bedenke, dass nicht jede ECMAScript-Implementierung das built-in hat.

"[...] das build-in hat.". Was soll das sein? Denglisch?

Ich vermute, Thomas meinte eigentlich, dass diese JSON.parse() nicht in
jeder ECMAScript-Implementierung zur Verfügung steht.

Deshalb zur Frage des OP:

Wo genau soll das Script laufen? Woher kommen die JSON-Daten, die im
Script verwendet werden sollen?


--
Arno Welzel
http://arnowelzel.de
http://de-rec-fahrrad.de

Frank Faulstich

unread,
Mar 15, 2013, 1:48:15 PM3/15/13
to
Hallo Thomas,

vielen Dank für die schnelle Antwort.

Am Freitag, 15. März 2013 14:06:04 UTC+1 schrieb Thomas 'PointedEars' Lahn:
> > Datei ist lokal gespeichert.
>
> ^^^^^^^^^^^^^^^^^
>
> Das heisst?
>
Die JSON-Datei sowie JavaScript- und HTML-Dateien liegen in einem Ordner auf einer DVD.


> > var versions = JSON.parse(jsontext);
>
> Bedenke, dass nicht jede ECMAScript-Implementierung das built-in hat.
>

Ja, das ist mit klar. Es ist in diesem Fall aber kein Problem, da das Ganze nur im IE funktionieren muss. Es geht um ein Startmenü von einer DVD. Per autorun.inf wird eine setup.exe gestartet, die den IE einbindet.

> > Muss ich das wirklich mit XMLHttpRequest() machen
>
> Nein.
>
Schön.

> > oder geht das einfacher?
>
> Ja. Ob das aber besser wäre, steht auf einem anderen Blatt.
>
Wie geht das? Was wäre schlecht daran?

Viele Grüße

Frank

Frank Faulstich

unread,
Mar 15, 2013, 2:43:00 PM3/15/13
to
Am Freitag, 15. März 2013 16:01:57 UTC+1 schrieb Arno Welzel:
[...]
> Wo genau soll das Script laufen? Woher kommen die JSON-Daten, die im
>
> Script verwendet werden sollen?
>

Hallo Arno,

es geht bei der Sache um ein Startmenü für eine DVD. Per autorun.inf wird ein kleines Programm gestartet, das den auf dem System installierten IE einbindet. Im Unterschied zum "echten" IE können hier per Link die EXE-Dateiein der einzelnen Installationen gestartet werden.

Ich möchte im Menü die Versionsnummern der verschiedenen Programme anzeigen. Natürlich könnte ich die auch direkt in die HTML-Dateien schreiben. Es sprechen da aber zwei Sachen dagegen.

1. Die DVD ist mehrsprachig. Es müssten die Versionsnummern in 18 verschiedene HTML-Dateien geschrieben werden. Da geht mit Sicherheit was schief.

2. Die Versionsnummern sollten auch von Laien geändert werden können. Das Ändern im HTML ist zu kompliziert. Ich dachte zuerst daran, das in einer XML-Datei zu speichern aber JSON ist noch leichter verständlich.

Viele Grüße

Frank

Thomas 'PointedEars' Lahn

unread,
Mar 15, 2013, 3:54:02 PM3/15/13
to
Frank Faulstich wrote:

> Thomas 'PointedEars' Lahn [wrote]:
>> > var versions = JSON.parse(jsontext);
>>
>> Bedenke, dass nicht jede ECMAScript-Implementierung das built-in hat.
>
> Ja, das ist mit klar. Es ist in diesem Fall aber kein Problem, da das
> Ganze nur im IE funktionieren muss. Es geht um ein Startmenü von einer
> DVD. Per autorun.inf wird eine setup.exe gestartet, die den IE einbindet.

Deine Argumentation ist nicht logisch. Aus der aktuellen ECMAScript Support
Matrix geht schliesslich hervor, dass JScript bis einschliesslich Version
9.x keine eingebaute Unterstützung für JSON hat. Die neue (noch
unveröffentlichte) Version der Matrix korrigiert das und zeigt, dass
JSON.parse() und JSON.stringify() erst seit JScript 5.8.23141 (gemäss
ECMAScript Edition 5) unterstützt werden.

Kannst Du garantieren, dass MSHTML ≥ 8.0.6001.18702IC installiert ist,
verwendet wird und dabei der standardkonforme Modus verwendet wird? Wenn
nein, musst Du alternativ für eine benutzerdefinierte Implementierung sorgen
oder (besser nicht) eval() verwenden.

>> > oder geht das einfacher?
>> Ja. Ob das aber besser wäre, steht auf einem anderen Blatt.
>
> Wie geht das?

Zum Beispiel könntest Du die Textressource in einen Frame laden und den
relevanten Teil des Frame-Dokuments an eine geeignete Funktion übergeben.

> Was wäre schlecht daran?

Es ist unnötig kompliziert. IXMLHTTPRequest wurde 1999 von Microsoft als
Komponente in MSXML2 für den Zugriff mit Internet Explorer auf Outlook Web
Access für Exchange Server 2000 entwickelt. Erst später folgten
Implementierungen von Mozilla, sowie von Opera, Apple und Google (wodurch
jemand auf die Idee kam, dieses gar nicht neue Prinzip „AJAX“ zu nennen –
“Asynchronous JavaScript and XML”, eine in jeder Hinsicht fhcsale
Bezeichnung), und schliesslich die W3C-Spezifikationen “XMLHttpRequest” (CR,
im Dezember 2012 eingestellt) bzw. “XMLHttpRequest Level 2” (WD, neu nur
noch “XMLHttpRequest”).

Mit dem ActiveX-Control (implementiert weitestgehend W3C XMLHttpRequest)
lässt sich in JScript/MSHTML über file:// URIs auch auf Dateien im
Dateisystem zugreifen, sofern auf das Dokument, in dem sich der Quelltext
befindet, ebenfalls mit file:// zugegriffen wird.

<http://en.wikipedia.org/wiki/XMLHttpRequest>

Gregor Kofler

unread,
Mar 15, 2013, 3:56:17 PM3/15/13
to
Am 15.03.2013 18:48, Frank Faulstich meinte:
> Hallo Thomas,
>
> vielen Dank f�r die schnelle Antwort.
>
> Am Freitag, 15. M�rz 2013 14:06:04 UTC+1 schrieb Thomas 'PointedEars' Lahn:
>>> Datei ist lokal gespeichert.
>>
>> ^^^^^^^^^^^^^^^^^
>>
>> Das heisst?
>>
> Die JSON-Datei sowie JavaScript- und HTML-Dateien liegen in einem Ordner auf einer DVD.

Dann braucht man das JSON-Geparse doch nicht.

Im HTML:

<script type="text/javascript" src="config.js"></script>

Und in config.js:

var myConfig = {
version: 1,
title: "something"
...
};


Allerdings ist myConfig eine globale Variable (oder eine Eigenschaft des
globalen Objektes).

Gregor

Thomas 'PointedEars' Lahn

unread,
Mar 15, 2013, 4:09:04 PM3/15/13
to
Gregor Kofler wrote:

> Am 15.03.2013 18:48, Frank Faulstich meinte:
>> […] Thomas 'PointedEars' Lahn [wrote]:
>>>> Datei ist lokal gespeichert.
>>> ^^^^^^^^^^^^^^^^^
>>> Das heisst?
>>
>> Die JSON-Datei sowie JavaScript- und HTML-Dateien liegen in einem Ordner
>> auf einer DVD.
>
> Dann braucht man das JSON-Geparse doch nicht.
>
> Im HTML:
>
> <script type="text/javascript" src="config.js"></script>
>
> Und in config.js:
>
> var myConfig = {
> version: 1,
> title: "something"
> ...
> };

Theoretisch richtig; praktisch könnte es aber sein, dass es sich um sehr
viele Daten handelt, und diese erst nachträglich, und zuverlässig, geladen
werden sollen.

Mit einem script-Element erhöhte sich dann die Wartezeit, bis die
Applikation grundlegend geladen ist. In diesem Fall könnte man das aber mit
dem defer-Attribut (HTML5) umgehen, welches in MSHTML schon länger
proprietär unterstützt wird.

> Allerdings ist myConfig eine globale Variable (oder eine Eigenschaft des
> globalen Objektes).

Und es könnte sein, dass das nicht gewollt ist. Zur Lösung dieses Problems
wäre theoretisch etwas wie

var my = {
name: {
space: {
myConfig: {

}
}
}
};

möglich. Der Vorteil von JSON ist, dass man die Daten nicht anpassen muss,
und dass sie nur in dem Kontext definiert werden müssen, in dem sie
gebraucht werden. Neben Information Hiding ist dann auch die Scope Chain
kürzer.

Heinz Schmitz

unread,
Mar 16, 2013, 7:03:21 AM3/16/13
to
Arno Welzel wrote:

>> Bedenke, dass nicht jede ECMAScript-Implementierung das built-in hat.

>"[...] das build-in hat.". Was soll das sein? Denglisch?

Deins ist Denglisch (buil. mit "D" am Ende). Vorher wars ok (imho).

Gr��e,
H.


Frank Faulstich

unread,
Mar 17, 2013, 1:08:39 PM3/17/13
to
Am Freitag, 15. März 2013 20:54:02 UTC+1 schrieb Thomas 'PointedEars' Lahn:
[...]
>
> Zum Beispiel könntest Du die Textressource in einen Frame laden und den
>
> relevanten Teil des Frame-Dokuments an eine geeignete Funktion übergeben.
>

Das mit einem Frame ist eine sehr gute Idee. Damit wäre auch eine Lösung ganz ohne JS möglich.
Allerdings muss der Hintergrund des gesamten Menüs eine bunte Grafik sein. Da wird es schwierig mit der Formatierung. Deswegen werde ich wohl doch lieber auf die Lösung von Gregor zurückgreifen.
Vielen Dank für deine Hilfe.

Viele Grüße
Frank

Frank Faulstich

unread,
Mar 17, 2013, 1:12:45 PM3/17/13
to
Am Freitag, 15. März 2013 20:56:17 UTC+1 schrieb Gregor Kofler:
[...]
> Dann braucht man das JSON-Geparse doch nicht.
>
> Im HTML:
>
> <script type="text/javascript" src="config.js"></script>
>
> Und in config.js:
>
> var myConfig = {
> version: 1,
> title: "something"
> ...
> };
>
> Allerdings ist myConfig eine globale Variable (oder eine Eigenschaft des
>
> globalen Objektes).
>

Hallo Gregor,

ich denke, das ist die optimale Lösung für mein Problem. Ich hatte wirklich Tomaten auf den Augen.
Danke für die Unterstützung!

Viele Grüße
Frank

Frank Faulstich

unread,
Mar 17, 2013, 1:25:20 PM3/17/13
to
Am Freitag, 15. März 2013 21:09:04 UTC+1 schrieb Thomas 'PointedEars' Lahn:
[...]
> Theoretisch richtig; praktisch könnte es aber sein, dass es sich um sehr
> viele Daten handelt, und diese erst nachträglich, und zuverlässig, geladen
> werden sollen.
>
In meinem Fall sind es momentan 2 Schlüssel-Wert-Paare. Maximal können es in Zukunft 4 Paare werden. Deswegen ist dieser Nachteil für mein Problem wohl nicht relevant.

Viele Grüße
Frank

Thomas 'PointedEars' Lahn

unread,
Mar 17, 2013, 1:54:55 PM3/17/13
to
Frank Faulstich wrote:

> Thomas 'PointedEars' Lahn [wrote]:
> [...]
>> Zum Beispiel könntest Du die Textressource in einen Frame laden und den
>>
>> relevanten Teil des Frame-Dokuments an eine geeignete Funktion übergeben.
>
> Das mit einem Frame ist eine sehr gute Idee. Damit wäre auch eine Lösung
> ganz ohne JS möglich.

Und wie?

> Vielen Dank für deine Hilfe.

Gern. Bitte beachte zukünftig die letzte Zeile meiner Signatur. Danke.
0 new messages