Rückgabe von JSON aus einem PHP-Skript

877

Ich möchte JSON von einem PHP-Skript zurückgeben.

Echo ich nur das Ergebnis? Muss ich den Content-TypeHeader setzen?

Scott Nicol
quelle

Antworten:

1603

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).

timdev
quelle
9
Nur für den Fall: Sie sollten header () -Befehle nur zusätzlich zur Ausgabepufferung verwenden, um Warnungen zu vermeiden, dass "Header bereits gesendet wurden"
Kevin
6
Die PHP-Datei muss in UTF-8 ohne Stückliste codiert werden :)
Krzysztof Kalinowski
217
header('Content-type:application/json;charset=utf-8');
Timo Huovinen
14
@mikepote Ich glaube eigentlich nicht, dass es notwendig ist, den Header-Befehl oben in der PHP-Datei zu haben. Wenn Sie versehentlich Dinge ausspucken und dadurch Ihren Header-Befehl auslösen, müssen Sie nur Ihren Code reparieren, weil er kaputt ist.
Halfstop
8
@KrzysztofKalinowski nein, die PHP-Datei muss nicht UTF-8-codiert sein. Der Ausgang MUSS UTF-8-codiert sein. Diese falschen Aussagen helfen nicht erfahrenen Benutzern nicht zu lernen, wie man verhindert, dass Dinge kaputt gehen, aber es hilft, Mythen über sie zu entwickeln und nie zu lernen, welche Rolle Codierungen für Streams spielen und wie sie funktionieren.
Áxel Costas Pena
124

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 );
aesede
quelle
44

Laut Handbuch zurjson_encode Methode kann eine Nicht-Zeichenfolge ( false ) zurückgegeben werden:

Gibt bei Erfolg oder FALSEMisserfolg eine JSON-codierte Zeichenfolge zurück.

In diesem Fall echo json_encode($data)wird die leere Zeichenfolge ausgegeben, die ungültig ist .

json_encodewird 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 .

Trincot
quelle
2
Es gibt keinen charsetParameter 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.)
Patrick Dark
1
Vielen Dank für die Hervorhebung, @PatrickDark. Redundanter charsetParameter aus HTTP-Header-Zeichenfolge entfernt.
Trincot
38

Versuchen Sie json_encode , um die Daten zu codieren und den Inhaltstyp mit festzulegenheader('Content-type: application/json'); .

thejh
quelle
15

Stellen Sie den Inhaltstyp mit ein header('Content-type: application/json');und geben Sie Ihre Daten wieder.

Brad Mace
quelle
12

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?

Dr. Aaron Dishno
quelle
7
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
Joyal
quelle
Was ist der Unterschied, der den Zeichensatz im Header angibt? Bitte erklären Sie, danke.
Sanxofon
6

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.

Tom Ah
quelle
4

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();
}
Dan
quelle
1
header_removeEs 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 exitErklärung am Ende hinzufügen . Ich habe Ihre Funktion mit der von @trincot kombiniert: stackoverflow.com/a/35391449/339440
Stephen R
Danke für den Vorschlag. Ich habe gerade die Antwort aktualisiert.
Dan
3

Die Antwort auf Ihre Frage finden Sie hier :

Es sagt.

Der MIME-Medientyp für JSON-Text ist application / json.

Wenn Sie also den Header auf diesen Typ setzen und Ihre JSON-Zeichenfolge ausgeben, sollte dies funktionieren.

Codemwnci
quelle
1

Ja, Sie müssen Echo verwenden, um die Ausgabe anzuzeigen. Mimetyp: application / json

Nev Stokes
quelle
1

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.'"}';

jacr1614
quelle
1

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 .

Auge
quelle
1

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;
?>
Bidyashish Kumar
quelle
Der MIME-Medientyp für JSON-Text ist application / json
AA
0

Eine einfache Möglichkeit, Ihre Domänenobjekte in JSON zu formatieren, ist die Verwendung des Marshal Serializer . Übergeben Sie dann die Daten an json_encodeund 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/jsonals 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);
Kingson
quelle
0

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:

Geben Sie hier die Bildbeschreibung ein

Neeraj Singh
quelle
-1

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();
?>
Alexis Paques
quelle