Ich möchte JSON von einem PHP-Skript zurückgeben.
Echo ich nur das Ergebnis? Muss ich den Content-Type
Header setzen?
Ich möchte JSON von einem PHP-Skript zurückgeben.
Echo ich nur das Ergebnis? Muss ich den Content-Type
Header setzen?
Antworten:
Während es Ihnen normalerweise gut geht, können und sollten Sie den Content-Type-Header festlegen:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
Wenn ich kein bestimmtes Framework verwende, erlaube ich normalerweise einigen Anforderungsparametern, das Ausgabeverhalten zu ändern. Im Allgemeinen kann es für eine schnelle Fehlerbehebung nützlich sein, keinen Header zu senden oder manchmal die Datennutzlast zu drucken, um sie zu betrachten (obwohl dies in den meisten Fällen nicht erforderlich sein sollte).
header('Content-type:application/json;charset=utf-8');
Ein vollständiger, netter und klarer PHP-Code, der JSON zurückgibt, ist:
$option = $_GET['option'];
if ( $option == 1 ) {
$data = [ 'a', 'b', 'c' ];
// will encode to JSON array: ["a","b","c"]
// accessed as example in JavaScript like: result[1] (returns "b")
} else {
$data = [ 'name' => 'God', 'age' => -1 ];
// will encode to JSON object: {"name":"God","age":-1}
// accessed as example in JavaScript like: result.name or result['name'] (returns "God")
}
header('Content-type: application/json');
echo json_encode( $data );
Laut Handbuch zurjson_encode
Methode kann eine Nicht-Zeichenfolge ( false ) zurückgegeben werden:
Gibt bei Erfolg oder
FALSE
Misserfolg eine JSON-codierte Zeichenfolge zurück.
In diesem Fall echo json_encode($data)
wird die leere Zeichenfolge ausgegeben, die ungültig ist .
json_encode
wird zum Beispiel fehlschlagen (und zurückgeben false
), wenn sein Argument eine Nicht-UTF-8-Zeichenfolge enthält.
Diese Fehlerbedingung sollte in PHP erfasst werden, zum Beispiel wie folgt:
<?php
header("Content-Type: application/json");
// Collect what you need in the $data variable.
$json = json_encode($data);
if ($json === false) {
// Avoid echo of empty string (which is invalid JSON), and
// JSONify the error message instead:
$json = json_encode(["jsonError" => json_last_error_msg()]);
if ($json === false) {
// This should not happen, but we go all the way now:
$json = '{"jsonError":"unknown"}';
}
// Set HTTP response status code to: 500 - Internal Server Error
http_response_code(500);
}
echo $json;
?>
Dann sollte das empfangende Ende natürlich wissen, dass das Vorhandensein der jsonError- Eigenschaft einen Fehlerzustand anzeigt, den es entsprechend behandeln sollte.
Im Produktionsmodus ist es möglicherweise besser, nur einen allgemeinen Fehlerstatus an den Client zu senden und die spezifischeren Fehlermeldungen für spätere Untersuchungen zu protokollieren.
Weitere Informationen zum Umgang mit JSON-Fehlern finden Sie in der PHP-Dokumentation .
charset
Parameter für JSON. Siehe den Hinweis am Ende von tools.ietf.org/html/rfc8259#section-11 : "Für diese Registrierung ist kein 'Zeichensatz'-Parameter definiert. Das Hinzufügen eines Parameters hat keine Auswirkungen auf kompatible Empfänger." (JSON muss als UTF-8 per tools.ietf.org/html/rfc8259#section-8.1 übertragen werden , daher ist die Angabe, dass es als UTF-8 codiert ist, etwas redundant.)
charset
Parameter aus HTTP-Header-Zeichenfolge entfernt.
Versuchen Sie json_encode , um die Daten zu codieren und den Inhaltstyp mit festzulegenheader('Content-type: application/json');
.
Es ist auch gut, die Zugriffssicherheit festzulegen - ersetzen Sie einfach * durch die Domain, die Sie erreichen möchten.
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
$response = array();
$response[0] = array(
'id' => '1',
'value1'=> 'value1',
'value2'=> 'value2'
);
echo json_encode($response);
?>
Hier sind weitere Beispiele dazu: Wie kann man Access-Control-Allow-Origin umgehen?
Wie oben gesagt:
header('Content-Type: application/json');
wird den Job machen. aber denken Sie daran, dass:
Ajax kann problemlos json lesen, auch wenn dieser Header nicht verwendet wird, es sei denn, Ihr json enthält einige HTML-Tags. In diesem Fall müssen Sie den Header als application / json festlegen.
Stellen Sie sicher, dass Ihre Datei nicht in UTF8-BOM codiert ist. In diesem Format wird oben in der Datei ein Zeichen hinzugefügt, sodass der Aufruf von header () fehlschlägt.
Eine einfache Funktion zum Zurückgeben einer JSON-Antwort mit dem HTTP-Statuscode .
function json_response($data=null, $httpStatus=200)
{
header_remove();
header("Content-Type: application/json");
http_response_code($httpStatus);
echo json_encode($data);
exit();
}
header_remove
Es ist eine gute Idee, die http-Antwort explizit festzulegen. obwohl das Setzen des Status und dann von http_response überflüssig erscheint. Vielleicht möchten Sie auch eine exit
Erklärung am Ende hinzufügen . Ich habe Ihre Funktion mit der von @trincot kombiniert: stackoverflow.com/a/35391449/339440
Ja, Sie müssen Echo verwenden, um die Ausgabe anzuzeigen. Mimetyp: application / json
Wenn Sie json von PHP benötigen, um benutzerdefinierte Informationen zu senden, können Sie diese hinzufügen, header('Content-Type: application/json');
bevor Sie andere Dinge drucken. Dann können Sie Ihre Kunden druckenecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
Wenn Sie eine Datenbank abfragen und die Ergebnismenge im JSON-Format benötigen, können Sie dies folgendermaßen tun:
<?php
$db = mysqli_connect("localhost","root","","mylogs");
//MSG
$query = "SELECT * FROM logs LIMIT 20";
$result = mysqli_query($db, $query);
//Add all records to an array
$rows = array();
while($row = $result->fetch_array()){
$rows[] = $row;
}
//Return result to jTable
$qryResult = array();
$qryResult['logs'] = $rows;
echo json_encode($qryResult);
mysqli_close($db);
?>
Weitere Informationen zum Parsen des Ergebnisses mit jQuery finden Sie in diesem Lernprogramm .
Dies ist ein einfaches PHP-Skript, mit dem männliche Frauen und Benutzer-IDs zurückgegeben werden, da der json-Wert ein beliebiger zufälliger Wert ist, wenn Sie das Skript json.php aufrufen.
Hoffe diese Hilfe danke
<?php
header("Content-type: application/json");
$myObj=new \stdClass();
$myObj->user_id = rand(0, 10);
$myObj->male = rand(0, 5);
$myObj->female = rand(0, 5);
$myJSON = json_encode($myObj);
echo $myJSON;
?>
Eine einfache Möglichkeit, Ihre Domänenobjekte in JSON zu formatieren, ist die Verwendung des Marshal Serializer . Übergeben Sie dann die Daten an json_encode
und senden Sie den richtigen Content-Type-Header für Ihre Anforderungen. Wenn Sie ein Framework wie Symfony verwenden, müssen Sie die Header nicht manuell festlegen. Dort können Sie die JsonResponse verwenden .
Zum Beispiel wäre der richtige Inhaltstyp für den Umgang mit Javascript application/javascript
.
Oder wenn Sie einige ziemlich alte Browser unterstützen müssen, ist dies am sichersten text/javascript
.
Für alle anderen Zwecke wie eine mobile App application/json
als Inhaltstyp verwenden.
Hier ist ein kleines Beispiel:
<?php
...
$userCollection = [$user1, $user2, $user3];
$data = Marshal::serializeCollectionCallable(function (User $user) {
return [
'username' => $user->getUsername(),
'email' => $user->getEmail(),
'birthday' => $user->getBirthday()->format('Y-m-d'),
'followers => count($user->getFollowers()),
];
}, $userCollection);
header('Content-Type: application/json');
echo json_encode($data);
Wenn Sie versuchen, eine JSON-Antwort für die API zurückzugeben, oder sicherstellen, dass Sie über die richtigen Header verfügen, und sicherstellen, dass Sie gültige JSON-Daten zurückgeben.
Hier ist das Beispielskript, mit dem Sie die JSON-Antwort vom PHP-Array oder von der JSON-Datei zurückgeben können.
PHP-Skript (Code):
<?php
// Set required headers
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
/**
* Example: First
*
* Get JSON data from JSON file and retun as JSON response
*/
// Get JSON data from JSON file
$json = file_get_contents('response.json');
// Output, response
echo $json;
/** =. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =. */
/**
* Example: Second
*
* Build JSON data from PHP array and retun as JSON response
*/
// Or build JSON data from array (PHP)
$json_var = [
'hashtag' => 'HealthMatters',
'id' => '072b3d65-9168-49fd-a1c1-a4700fc017e0',
'sentiment' => [
'negative' => 44,
'positive' => 56,
],
'total' => '3400',
'users' => [
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'rayalrumbel',
'text' => 'Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'mikedingdong',
'text' => 'Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'ScottMili',
'text' => 'Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'yogibawa',
'text' => 'Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
],
];
// Output, response
echo json_encode($json_var);
JSON-Datei (JSON-DATEN):
{
"hashtag": "HealthMatters",
"id": "072b3d65-9168-49fd-a1c1-a4700fc017e0",
"sentiment": {
"negative": 44,
"positive": 56
},
"total": "3400",
"users": [
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "rayalrumbel",
"text": "Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
},
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "mikedingdong",
"text": "Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
},
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "ScottMili",
"text": "Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
},
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "yogibawa",
"text": "Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
}
]
}
JSON Screeshot:
Sie können diese kleine PHP-Bibliothek verwenden . Es sendet die Header und gibt Ihnen ein Objekt, mit dem Sie es einfach verwenden können.
Es sieht aus wie :
<?php
// Include the json class
include('includes/json.php');
// Then create the PHP-Json Object to suits your needs
// Set a variable ; var name = {}
$Json = new json('var', 'name');
// Fire a callback ; callback({});
$Json = new json('callback', 'name');
// Just send a raw JSON ; {}
$Json = new json();
// Build data
$object = new stdClass();
$object->test = 'OK';
$arraytest = array('1','2','3');
$jsonOnly = '{"Hello" : "darling"}';
// Add some content
$Json->add('width', '565px');
$Json->add('You are logged IN');
$Json->add('An_Object', $object);
$Json->add("An_Array",$arraytest);
$Json->add("A_Json",$jsonOnly);
// Finally, send the JSON.
$Json->send();
?>