You are not logged in.

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Saturday, January 29th 2011, 4:17pm

Tags

interoperabilität, JavaScript, json, PHP

Abstract

JSON ist ein kompaktes, unabhängiges Format Format zur Interoperabilität zwischen Anwendungen. Dieses Beispiel behandelt die Sprachen PHP und JavaScript.

Article

JSON, kurz für JavaScript Object Notation und gesprochen wie der Name Jason, ist ein kompaktes Computer-Format in für Mensch und Maschine einfach lesbarer Textform, zum Zweck des Datenaustauschs zwischen Anwendungen.

1. Wann benötigt man ein solches Format?


Wollen wir zum Beispiel ein Personen-Objekt aus unserer C# Desktop Anwendung an unseren PHP Internet Server senden, so benötigen wir neben den Internet Protokollen auch einen Standard um Daten zwischen C# und PHP auszutauschen.

Mit einer Semikolon-getrennten Liste kann man rudmentäre Daten super übertragen und in beiden Programmiersprachen ist es ein leichtes den Datensatz zu verwenden.

Source code

1
Max;Mustermann;Musterstraße 11;11111 Musterstadt;


Verwenden wir stattdessen eine komplizierte, mehrdimensionale Struktur so sind diese s.g. CSV Datensätze nicht zu gebrauchen.
Eine Lösung muss her: In diesem Beitrag wird die Lösung JSON anhand einer häufig verbreiteten Kombination "JavaScript und PHP" erläutert.

Vergleichen wir zuerst wie wir eine Liste in beiden Sprachen ausgeben.

2. Liste in PHP verarbeiten


PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
// PHP Datenerhebung
$data = array(
	array(
		'firstname' => 'Max',
		'lastname' => 'Mustermann',
		'websites' => 
		array(
			'http://www.easy-coding.de',
			'http://www.coder-suche.de'
		)
	),
	array(
		'firstname' => 'Larry',
		'lastname' => 'Page',
		'websites' => 
		array(
			'http://www.google.de',
			'http://www.google.com',
			'http://www.google.co.uk'
		)
	)
);
 
// PHP Daten ausgeben
foreach($data as $row) {
	echo $row['firstname'];
	echo "<ul>";
	foreach($row['websites'] as $url) {
		echo "<li>{$url}</li>";
	}
	echo "</ul>";
}
?>


3. Liste in JavaScript verarbeiten


JavaScript Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<script type="text/javascript">
// JavaScript Datenerhebung
var data = new Object(
	{
		firstname : 'Max', 
		lastname : 'Mustermann', 
		websites : new Array(
			'http://www.easy-coding.de',
			'http://www.coder-suche.de'
		) 
	},
	{
		firstname : 'Larry', 
		lastname : 'Page', 
		websites : new Array(
			'http://www.google.de',
			'http://www.google.com',
			'http://www.google.co.uk'
		) 
	}
);
 
// JavaScript Daten ausgeben
for(var row in data) {
	var row = data[row];
	document.writeln(row['firstname']);
	document.writeln("<ul>");
	for(var url in row['websites']) {
		url = row['websites'][url];
		document.writeln("<li>"+url+"</li>");
	}
	document.writeln("</ul>");
}
</script>



4. Brücke von PHP nach JavaScript schlagen


Sieht man von den syntaktischen Unterschieden der Sprachen ab, haben wir das selbe Beispiel mit zwei verschiedenen Programmiersprachen umgesetzt.
In diesem Schritt wird die Brücke von PHP nach JavaScript geschlagen.
Als Eingabestream werden wir nicht mehr das JavaScript Array "data" - sondern serialisieren stattdessen das PHP Array zu einem JSON String.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
// PHP Datenerhebung
$data = array(
	array(
		'firstname' => 'Max',
		'lastname' => 'Mustermann',
		'websites' => 
		array(
			'http://www.easy-coding.de',
			'http://www.coder-suche.de'
		)
	),
	array(
		'firstname' => 'Larry',
		'lastname' => 'Page',
		'websites' => 
		array(
			'http://www.google.de',
			'http://www.google.com',
			'http://www.google.co.uk'
		)
	)
);
// Brücke zwischen PHP und JavaScript (serverseitig)
$json = json_encode($data);
?>
<script type="text/javascript">
// JavaScript Datenerhebung
var json = '<?= $json ?>';
 
// Brücke zwischen PHP und JavaScript (clientseitig)
var data = eval('(' + json + ')');
 
// JavaScript Daten ausgeben
for(var row in data) {
	var row = data[row];
	document.writeln(row['firstname']);
	document.writeln("<ul>");
	for(var url in row['websites']) {
		url = row['websites'][url];
		document.writeln("<li>"+url+"</li>");
	}
	document.writeln("</ul>");
}
</script>


Im Klartext sieht der JSON String folgendermaßen aus:

Source code

1
2
var json = '[{"firstname":"Max","lastname":"Mustermann","websites":["http:\/\/www.easy-coding.de","http:\/\/www.coder-suche.de"]},
{"firstname":"Larry","lastname":"Page","websites":["http:\/\/www.google.de","http:\/\/www.google.com","http:\/\/www.google.co.uk"]}]';


5. Ältere PHP Versionen


PHP 5 bringt ein Modul mit, dass, weil es in C geschrieben ist, sehr performant arbeitet. Leider ist es nicht in allen Installationen vorhanden. Daher würde ich euch empfehlen zweigleisig zu fahren und eine Schnittstelle einzuführen, die bei Existenz der C-Funktion diese bevorzugt, bei Nichtexistenz aber eine andere verwendet.
Diese Schnittstelle sieht folgendermaßen aus:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
require_once 'Services_JSON.php';
 
class JSON {
	/**
	 * @param objekt -> PHP Objekt/Array/Variable 
	 * @param force -> Benutzung von Service_JSON erzwingen
	 * @return -> JSON String
	 */
	static public function encode($objekt, $force=false) {
		if(!function_exists('json_encode') || $force) {
			$tmp = new Services_JSON();
			return $tmp->encode($objekt)
		} else {
			return json_encode($objekt);
		}
	}
 
	/**
	 * @param str -> JSON String
	 * @param force -> Benutzung von Service_JSON erzwingen
	 * @return -> PHP Objekt/Array/Variable 
	 */
	static public function decode($str, $force=false) {
		if(!function_exists('json_decode') || $force) {
			$tmp = new Services_JSON();
			return $tmp->decode($str)
		} else {
			return json_decode($str);
		}
	}
}


Es verwendet Services_JSON, das unter der BSD Lizenz steht und hier erhältlich ist: http://pear.php.net/pepr/pepr-proposal-show.php?id=198
Nun zu einer Beispielimplementierung:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
<?php
require_once 'JSON.class.php';
class Ob {
        public $arr = array("hans"=>"123", "peter"=>"456");
        public $x = 5;
}
 
$ob = new Ob();
echo JSON::encode($ob);
// Ausgabe = {"arr":{"hans":"123","peter":"456"},"x":5}

Lexikon 4.1.3, developed by www.viecode.com