Suche…
Einführung
JSON ( JavaScript Object Notation ) ist eine plattform- und sprachunabhängige Möglichkeit, Objekte in Klartext zu serialisieren. Da es häufig im Web verwendet wird und so auch PHP, gibt es eine grundlegende Erweiterung für die Arbeit mit JSON in PHP.
Syntax
- Zeichenfolge json_encode (gemischter $ value [, int $ options = 0 [, int $ depth = 512]])
- gemischter json_decode (String $ json [, bool $ assoc = false [, int $ tiefe = 512 [, int $ options = 0]]])
Parameter
Parameter | Einzelheiten |
---|---|
json_encode | - |
Wert | Der zu codierende Wert Kann jede Art außer einer Ressource sein. Alle String-Daten müssen UTF-8-codiert sein. |
Optionen | Bitmaske bestehend aus JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JON_HEX_APOS, JSON_NUMERIC_CHECK, JON_PRETTY_PRINT, J_KE_UNESCAPED_SLASHES, J_KEX_JACK_PRINT, J_KEX_JACK_PRINT, J_KEX_JACK_PRINT, J_HP_JACK_PRINT, J_HP_JACK_PRINT, J_HP_JACK_PRINT, J_HP_JACK_JACK_JACK_JACK_JACK_JACK_JACK. Das Verhalten dieser Konstanten wird auf der Seite der JSON-Konstanten beschrieben . |
Tiefe | Stellen Sie die maximale Tiefe ein. Muss größer als Null sein. |
json_decode | - |
Json | Die Json-Zeichenfolge wird dekodiert. Diese Funktion funktioniert nur mit UTF-8-kodierten Zeichenfolgen. |
Assoc | Sollte Funktion assoziatives Array anstelle von Objekten zurückgeben. |
Optionen | Bitmaske der JSON-Dekodierungsoptionen. Derzeit wird nur JSON_BIGINT_AS_STRING unterstützt (standardmäßig werden große Ganzzahlen als Floats umgewandelt) |
Bemerkungen
- Die Verarbeitung von ungültigem JSON durch json_decode ist sehr unhandlich und es ist sehr schwierig, zuverlässig zu bestimmen, ob die Dekodierung erfolgreich war. Json_decode gibt für ungültige Eingabe Null zurück, obwohl Null auch ein vollkommen gültiges Objekt für die Deklaration von JSON ist. Um solche Probleme zu vermeiden, sollten Sie immer bei jeder Verwendung json_last_error aufrufen.
Dekodierung einer JSON-Zeichenfolge
Die Funktion json_decode()
nimmt einen JSON-codierten String als ersten Parameter und parst ihn in eine PHP-Variable.
Normalerweise gibt json_decode()
ein Objekt von \ stdClass zurück, wenn das oberste Element des JSON-Objekts ein Wörterbuch oder ein indiziertes Array ist, wenn das JSON-Objekt ein Array ist. Es gibt auch Skalarwerte oder NULL
für bestimmte Skalarwerte zurück, z. B. einfache Zeichenfolgen, "true"
, "false"
und "null"
. Bei einem Fehler wird auch NULL
.
// Returns an object (The top level item in the JSON string is a JSON dictionary)
$json_string = '{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}';
$object = json_decode($json_string);
printf('Hello %s, You are %s years old.', $object->name, $object->age);
#> Hello Jeff, You are 20 years old.
// Returns an array (The top level item in the JSON string is a JSON array)
$json_string = '["Jeff", 20, true, ["red", "blue"]]';
$array = json_decode($json_string);
printf('Hello %s, You are %s years old.', $array[0], $array[1]);
Verwenden Sie var_dump()
, um die Typen und Werte der einzelnen Eigenschaften des Objekts anzuzeigen, das wir oben dekodiert haben.
// Dump our above $object to view how it was decoded
var_dump($object);
Ausgabe (beachten Sie die Variablentypen):
class stdClass#2 (4) {
["name"] => string(4) "Jeff"
["age"] => int(20)
["active"] => bool(true)
["colors"] =>
array(2) {
[0] => string(3) "red"
[1] => string(4) "blue"
}
}
Hinweis: Die Variablentypen in JSON wurden in ihre PHP - Äquivalent umgewandelt.
Eine zurückzukehren assoziative Array für JSON Objekte anstelle ein Objekt zurückzugeben, übergeben true
als der zweite Parameter auf json_decode()
.
$json_string = '{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}';
$array = json_decode($json_string, true); // Note the second parameter
var_dump($array);
Ausgabe (beachten Sie die Array-assoziative Struktur):
array(4) {
["name"] => string(4) "Jeff"
["age"] => int(20)
["active"] => bool(true)
["colors"] =>
array(2) {
[0] => string(3) "red"
[1] => string(4) "blue"
}
}
Der zweite Parameter ( $assoc
) hat keine Auswirkungen, wenn die zurückzugebende Variable kein Objekt ist.
Hinweis: Wenn Sie den $assoc
Parameter verwenden, wird die Unterscheidung zwischen einem leeren Array und einem leeren Objekt $assoc
. Das bedeutet, dass json_encode()
auf Ihrer decodierten Ausgabe ausgeführt wird, führt dies zu einer anderen JSON-Struktur.
Wenn der JSON-String eine "Tiefe" von mehr als 512 Elementen aufweist ( 20 Elemente in älteren Versionen als 5.2.3 oder 128 in Version 5.2.3 ), wird die Funktion json_decode()
NULL
. In Versionen 5.3 oder höher kann dieser Grenzwert mit dem dritten Parameter ( $depth
) gesteuert werden (siehe unten).
Laut Handbuch:
PHP implementiert eine Obermenge von JSON wie in der ursprünglichen »RFC 4627- Spezifikation angegeben - es werden auch skalare Typen und NULL codiert und decodiert. RFC 4627 unterstützt diese Werte nur, wenn sie in einem Array oder einem Objekt verschachtelt sind. Obwohl diese Obermenge mit der erweiterten Definition von "JSON-Text" im neueren »RFC 7159 (die RFC 4627 ablösen soll) und » ECMA-404 übereinstimmt , kann dies Interoperabilitätsprobleme mit älteren JSON-Parsern verursachen, die sich strikt an RFC 4627 halten Kodierung eines einzelnen Skalarwerts.
Dies bedeutet, dass beispielsweise eine einfache Zeichenfolge als gültiges JSON-Objekt in PHP betrachtet wird:
$json = json_decode('"some string"', true);
var_dump($json, json_last_error_msg());
Ausgabe:
string(11) "some string"
string(8) "No error"
Einfache Strings, die sich nicht in einem Array oder Objekt befinden, sind jedoch nicht Teil des RFC 4627- Standards. Als Ergebnis erhalten Online-Checker wie JSLint , JSON Formatter & Validator (im RFC 4627-Modus) einen Fehler.
Es gibt einen dritten $depth
Parameter für die Rekursionstiefe (der Standardwert ist 512
), d. H.
Es gibt einen vierten Parameter für $options
. Es akzeptiert derzeit nur einen Wert, JSON_BIGINT_AS_STRING
. Das Standardverhalten (das diese Option nicht zulässt) besteht darin, große Ganzzahlen anstelle von Zeichenfolgen in Floats umzuwandeln.
Ungültige nicht untergeordnete Varianten der True-, False- und NULL-Literale werden nicht mehr als gültige Eingabe akzeptiert.
Also dieses Beispiel:
var_dump(json_decode('tRue'), json_last_error_msg());
var_dump(json_decode('tRUe'), json_last_error_msg());
var_dump(json_decode('tRUE'), json_last_error_msg());
var_dump(json_decode('TRUe'), json_last_error_msg());
var_dump(json_decode('TRUE'), json_last_error_msg());
var_dump(json_decode('true'), json_last_error_msg());
Vor PHP 5.6:
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
Und danach:
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
bool(true)
string(8) "No error"
Ähnliches Verhalten tritt für false
und null
.
Beachten Sie, dass json_decode()
NULL
json_decode()
wenn der String nicht konvertiert werden kann.
$json = "{'name': 'Jeff', 'age': 20 }" ; // invalid json
$person = json_decode($json);
echo $person->name; // Notice: Trying to get property of non-object: returns null
echo json_last_error();
# 4 (JSON_ERROR_SYNTAX)
echo json_last_error_msg();
# unexpected character
Es ist nicht sicher, sich nur darauf zu verlassen, dass der Rückgabewert NULL
, um Fehler zu erkennen. Wenn der JSON-String beispielsweise nur "null"
, gibt json_decode()
null
, obwohl kein Fehler aufgetreten ist.
Kodierung einer JSON-Zeichenfolge
Die Funktion json_encode
konvertiert ein PHP-Array (oder seit PHP 5.4 ein Objekt, das die JsonSerializable
Schnittstelle implementiert) in eine JSON-codierte Zeichenfolge. Bei Erfolg wird eine JSON-codierte Zeichenfolge oder bei einem Fehler FALSE zurückgegeben.
$array = [
'name' => 'Jeff',
'age' => 20,
'active' => true,
'colors' => ['red', 'blue'],
'values' => [0=>'foo', 3=>'bar'],
];
Während der Codierung werden die PHP-Datentypen string, integer und boolean in ihre JSON-Entsprechung konvertiert. Assoziative Arrays werden als JSON-Objekte codiert. Indem Sie mit Standardargumenten aufgerufen werden, werden indizierte Arrays als JSON-Arrays codiert. (Wenn die Array-Schlüssel keine fortlaufende numerische Sequenz sind, die bei 0 beginnt, wird das Array in diesem Fall als JSON-Objekt codiert.)
echo json_encode($array);
Ausgabe:
{"name":"Jeff","age":20,"active":true,"colors":["red","blue"],"values":{"0":"foo","3":"bar"}}
Argumente
Das zweite Argument für json_encode
ist seit PHP 5.3 eine Bitmaske, die eine oder mehrere der folgenden sein kann.
Wie bei jeder Bitmaske können sie mit dem binären ODER-Operator |
kombiniert werden .
JSON_FORCE_OBJECT
Erzwingt die Erstellung eines Objekts anstelle eines Arrays
$array = ['Joel', 23, true, ['red', 'blue']];
echo json_encode($array);
echo json_encode($array, JSON_FORCE_OBJECT);
Ausgabe:
["Joel",23,true,["red","blue"]]
{"0":"Joel","1":23,"2":true,"3":{"0":"red","1":"blue"}}
JSON_HEX_TAG
, JSON_HEX_AMP
, JSON_HEX_APOS
, JSON_HEX_QUOT
Stellt die folgenden Konvertierungen während der Codierung sicher:
Konstante | Eingang | Ausgabe |
---|---|---|
JSON_HEX_TAG | < | \u003C |
JSON_HEX_TAG | > | \u003E |
JSON_HEX_AMP | & | \u0026 |
JSON_HEX_APOS | ' | \u0027 |
JSON_HEX_QUOT | " | \u0022 |
$array = ["tag"=>"<>", "amp"=>"&", "apos"=>"'", "quot"=>"\""];
echo json_encode($array);
echo json_encode($array, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
Ausgabe:
{"tag":"<>","amp":"&","apos":"'","quot":"\""}
{"tag":"\u003C\u003E","amp":"\u0026","apos":"\u0027","quot":"\u0022"}
JSON_NUMERIC_CHECK
Stellt sicher, dass numerische Zeichenfolgen in Ganzzahlen konvertiert werden.
$array = ['23452', 23452];
echo json_encode($array);
echo json_encode($array, JSON_NUMERIC_CHECK);
Ausgabe:
["23452",23452]
[23452,23452]
JSON_PRETTY_PRINT
Macht das JSON leicht lesbar
$array = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
echo json_encode($array);
echo json_encode($array, JSON_PRETTY_PRINT);
Ausgabe:
{"a":1,"b":2,"c":3,"d":4}
{
"a": 1,
"b": 2,
"c": 3,
"d": 4
}
JSON_UNESCAPED_SLASHES
Inklusive unescaped /
Vorwärts-Schrägstriche in der Ausgabe
$array = ['filename' => 'example.txt', 'path' => '/full/path/to/file/'];
echo json_encode($array);
echo json_encode($array, JSON_UNESCAPED_SLASHES);
Ausgabe:
{"filename":"example.txt","path":"\/full\/path\/to\/file"}
{"filename":"example.txt","path":"/full/path/to/file"}
JSON_UNESCAPED_UNICODE
Enthält UTF8-kodierte Zeichen anstelle von \u
-kodierten Zeichenfolgen in der Ausgabe
$blues = ["english"=>"blue", "norwegian"=>"blå", "german"=>"blau"];
echo json_encode($blues);
echo json_encode($blues, JSON_UNESCAPED_UNICODE);
Ausgabe:
{"english":"blue","norwegian":"bl\u00e5","german":"blau"}
{"english":"blue","norwegian":"blå","german":"blau"}
JSON_PARTIAL_OUTPUT_ON_ERROR
Ermöglicht die Fortsetzung der Kodierung, wenn nicht kodierbare Werte gefunden werden.
$fp = fopen("foo.txt", "r");
$array = ["file"=>$fp, "name"=>"foo.txt"];
echo json_encode($array); // no output
echo json_encode($array, JSON_PARTIAL_OUTPUT_ON_ERROR);
Ausgabe:
{"file":null,"name":"foo.txt"}
JSON_PRESERVE_ZERO_FRACTION
Stellt sicher, dass Floats immer als Floats codiert werden.
$array = [5.0, 5.5];
echo json_encode($array);
echo json_encode($array, JSON_PRESERVE_ZERO_FRACTION);
Ausgabe:
[5,5.5]
[5.0,5.5]
JSON_UNESCAPED_LINE_TERMINATORS
Wenn verwendet mit JSON_UNESCAPED_UNICODE
, kehrt auf das Verhalten der älteren PHP - Versionen und nicht entkommt die Zeichen U + 2028 LINE SEPARATOR und U + 2029 ABSATZ SEPARATOR. Obwohl diese Zeichen in JSON gültig sind, sind diese Zeichen in JavaScript nicht gültig. JSON_UNESCAPED_UNICODE
wurde das Standardverhalten von JSON_UNESCAPED_UNICODE
in Version 7.1 geändert.
$array = ["line"=>"\xe2\x80\xa8", "paragraph"=>"\xe2\x80\xa9"];
echo json_encode($array, JSON_UNESCAPED_UNICODE);
echo json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_LINE_TERMINATORS);
Ausgabe:
{"line":"\u2028","paragraph":"\u2029"}
{"line":"
","paragraph":"
"}
Debuggen von JSON-Fehlern
Wenn json_encode
oder json_decode
die bereitgestellte json_decode
nicht analysieren kann, wird false
. PHP selbst erzeugt keine Fehler oder Warnungen, wenn dies geschieht. Der Benutzer muss die Funktionen json_last_error () und json_last_error_msg () verwenden, um zu prüfen, ob ein Fehler aufgetreten ist, und in der Anwendung entsprechend zu handeln (debuggen, Fehlermeldung anzeigen) , usw.).
Das folgende Beispiel zeigt einen häufigen Fehler bei der Arbeit mit JSON, einen Fehler beim Dekodieren / Kodieren einer JSON-Zeichenfolge (z. B. aufgrund einer fehlerhaften UTF-8-kodierten Zeichenfolge) .
// An incorrectly formed JSON string
$jsonString = json_encode("{'Bad JSON':\xB1\x31}");
if (json_last_error() != JSON_ERROR_NONE) {
printf("JSON Error: %s", json_last_error_msg());
}
#> JSON Error: Malformed UTF-8 characters, possibly incorrectly encoded
json_last_error_msg
json_last_error_msg()
gibt eine vom Menschen lesbare Nachricht des letzten Fehlers zurück, der beim Versuch aufgetreten ist, einen String zu codieren / decodieren.
- Diese Funktion gibt immer einen String zurück , auch wenn kein Fehler aufgetreten ist.
Die Standard - Zeichenfolge ohne Fehler lautetNo Error
- Es wird
false
wenn ein anderer (unbekannter) Fehler aufgetreten ist - Vorsicht bei Verwendung in Schleifen, da json_last_error_msg bei jeder Iteration überschrieben wird.
Sie sollten diese Funktion nur verwenden, um die Nachricht zur Anzeige abzurufen, nicht um sie in Steueranweisungen zu testen.
// Don't do this:
if (json_last_error_msg()){} // always true (it's a string)
if (json_last_error_msg() != "No Error"){} // Bad practice
// Do this: (test the integer against one of the pre-defined constants)
if (json_last_error() != JSON_ERROR_NONE) {
// Use json_last_error_msg to display the message only, (not test against it)
printf("JSON Error: %s", json_last_error_msg());
}
Diese Funktion existiert nicht vor PHP 5.5. Hier ist eine Polyfill-Implementierung:
if (!function_exists('json_last_error_msg')) {
function json_last_error_msg() {
static $ERRORS = array(
JSON_ERROR_NONE => 'No error',
JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
$error = json_last_error();
return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
}
}
json_last_error
json_last_error()
gibt eine Ganzzahl zurück , die einer der vordefinierten Konstanten von PHP zugeordnet ist.
Konstante | Bedeutung |
---|---|
JSON_ERROR_NONE | Es ist kein Fehler aufgetreten |
JSON_ERROR_DEPTH | Die maximale Stapeltiefe wurde überschritten |
JSON_ERROR_STATE_MISMATCH | Ungültiger oder fehlerhafter JSON |
JSON_ERROR_CTRL_CHAR | Steuerzeichenfehler, möglicherweise falsch codiert |
JSON_ERROR_SYNTAX | Syntaxfehler (seit PHP 5.3.3) |
JSON_ERROR_UTF8 | Fehlgeformte UTF-8-Zeichen, möglicherweise falsch codiert (seit PHP 5.5.0) |
JSON_ERROR_RECURSION | Eine oder mehrere rekursive Referenzen in dem zu codierenden Wert |
JSON_ERROR_INF_OR_NAN | Ein oder mehrere NAN- oder INF-Werte in dem zu codierenden Wert |
JSON_ERROR_UNSUPPORTED_TYPE | Es wurde ein Wert eines Typs angegeben, der nicht codiert werden kann |
JsonSerializable in einem Objekt verwenden
Beim Erstellen von REST-APIs müssen Sie möglicherweise die Informationen eines Objekts reduzieren, das an die Clientanwendung übergeben werden soll. Zu diesem Zweck zeigt dieses Beispiel, wie die JsonSerialiazble
Schnittstelle verwendet wird.
In diesem Beispiel erweitert die Klasse User
tatsächlich ein DB-Modellobjekt eines hypotetischen ORM.
class User extends Model implements JsonSerializable {
public $id;
public $name;
public $surname;
public $username;
public $password;
public $email;
public $date_created;
public $date_edit;
public $role;
public $status;
public function jsonSerialize() {
return [
'name' => $this->name,
'surname' => $this->surname,
'username' => $this->username
];
}
}
Fügen JsonSerializable
der Klasse die JsonSerializable
Implementierung hinzu, indem Sie die Methode jsonSerialize()
.
public function jsonSerialize()
Wenn Sie jetzt in Ihrem Anwendungscontroller oder json_encode()
das Objekt User an json_encode()
Sie das zurückgegebene json-codierte Array der jsonSerialize()
Methode anstelle des gesamten Objekts.
json_encode($User);
Wird zurückkehren:
{"name":"John", "surname":"Doe", "username" : "TestJson"}
Eigenschaftswerte Beispiel.
Dadurch wird sowohl die von einem RESTful-Endpunkt zurückgegebene Datenmenge reduziert, als auch Objekteigenschaften von einer Json-Darstellung ausgeschlossen.
Private und geschützte Eigenschaften mit json_encode()
Um die Verwendung von JsonSerializable zu vermeiden, können Sie auch private oder geschützte Eigenschaften verwenden, um Klasseninformationen vor der json_encode()
von json_encode()
. Die Klasse muss dann \ JsonSerializable nicht implementieren.
Die Funktion json_encode () codiert nur öffentliche Eigenschaften einer Klasse in JSON.
<?php
class User {
// private properties only within this class
private $id;
private $date_created;
private $date_edit;
// properties used in extended classes
protected $password;
protected $email;
protected $role;
protected $status;
// share these properties with the end user
public $name;
public $surname;
public $username;
// jsonSerialize() not needed here
}
$theUser = new User();
var_dump(json_encode($theUser));
Ausgabe:
string(44) "{"name":null,"surname":null,"username":null}"
Header Json und die zurückgegebene Antwort
Durch Hinzufügen eines Headers mit dem Inhaltstyp als JSON:
<?php
$result = array('menu1' => 'home', 'menu2' => 'code php', 'menu3' => 'about');
//return the json response :
header('Content-Type: application/json'); // <-- header declaration
echo json_encode($result, true); // <--- encode
exit();
Der Header ist vorhanden, damit Ihre App feststellen kann, welche Daten zurückgegeben wurden und wie sie damit umgehen sollte.
Beachten Sie Folgendes: Der Inhaltsheader enthält lediglich Informationen zum Typ der zurückgegebenen Daten.
Wenn Sie UTF-8 verwenden, können Sie Folgendes verwenden:
header("Content-Type: application/json;charset=utf-8");
Beispiel jQuery:
$.ajax({
url:'url_your_page_php_that_return_json'
}).done(function(data){
console.table('json ',data);
console.log('Menu1 : ', data.menu1);
});