it-swarm.com.de

Rückgabe von JSON aus einem PHP Skript

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

Echo ich nur das Ergebnis? Muss ich den Header Content-Type setzen?

782
Scott Nicol

Während es Ihnen normalerweise gut geht, können und sollten Sie den Content-Type-Header setzen:

<?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 die schnelle Fehlerbehebung hilfreich sein, keinen Header zu senden oder die Nutzdaten manchmal auszudrucken, um sie zu betrachten (obwohl dies in den meisten Fällen nicht erforderlich sein sollte).

1422
timdev

Ein komplettes Stück von nettem und klarem 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 );
110
aesede

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

38
thejh

Entsprechend dem manual on json_encode kann die Methode einen Nicht-String zurückgeben ( false ):

Gibt eine JSON-codierte Zeichenfolge bei Erfolg oder FALSE bei einem Fehler zurück.

In diesem Fall gibt echo json_encode($data) den leeren String aus, der ngültiges JSON ist.

json_encode schlägt beispielsweise fehl (und gibt false zurück), wenn sein Argument eine Nicht-UTF-8-Zeichenfolge enthält.

Diese Fehlerbedingung sollte in PHP erfasst werden, zum Beispiel so:

<?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(array("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 Eigenschaft jsonError 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 eine spätere Untersuchung zu protokollieren.

Weitere Informationen zum Umgang mit JSON-Fehlern finden Sie in PHP's Documentation .

37
trincot

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

15
Brad Mace

Es ist auch gut, die Zugriffssicherheit einzustellen - 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 umgeht man Access-Control-Allow-Origin?

11
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
4
Joyal

Wie oben gesagt:

header('Content-Type: application/json');

wird den Job machen. aber denken Sie daran, dass:

  • Ajax wird kein Problem damit haben, json zu lesen, auch wenn dieser Header nicht verwendet wird, außer wenn Ihr json einige HTML-Tags enthält. In diesem Fall müssen Sie den Header als application/json festlegen.

  • Stellen Sie sicher, dass Ihre Datei nicht in UTF8-BOM codiert ist. Bei diesem Format wird ein Zeichen oben in die Datei eingefügt, sodass der Aufruf von header () fehlschlägt.

4
Tom Ah

Die Antwort auf Ihre Frage ist 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.

3
Codemwnci

Wenn Sie JSON von PHP erhalten müssen, indem Sie benutzerdefinierte Informationen senden, können Sie dieses header('Content-Type: application/json'); hinzufügen, bevor Sie eine andere Sache drucken. Dann können Sie Ihr Custome echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}'; drucken.

1
jacr1614

Dies ist ein einfaches PHP Skript, mit dem männlich weiblich und die Benutzer-ID als JSON-Wert zurückgegeben werden können. Dies ist ein beliebiger Zufallswert, 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;
?>
1

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

1
Nev Stokes

Eine einfache Möglichkeit, Ihre Domain-Objekte in JSON zu formatieren, ist die Verwendung von 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, wäre der sicherste text/javascript.

Für alle anderen Zwecke wie eine mobile App verwenden Sie application/json als Inhaltstyp.

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);
0
Kingson

Sie können diese kleine PHP Bibliothek verwenden. Es sendet die Header und gibt Ihnen ein Objekt, um es einfach zu verwenden.

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

Wenn Sie eine Datenbank abfragen und die Ergebnismenge im JSON-Format benötigen, kann dies folgendermaßen erfolgen:

<?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 dieses Tutorial .

0
Eyece

Eine einfache Funktion, um eine JSON-Antwort mit dem HTTP-Statuscode zurückzugeben.

function json_response($data=null, $httpStatus=200)
{
    header_remove();

    header("Content-Type: application/json");

    header('Status: ' . $httpStatus);

    http_response_code($httpStatus);

    echo json_encode($data);
}
0
Dan

Wann immer Sie versuchen, eine JSON-Antwort für die API zurückzugeben, oder stellen Sie sicher, dass Sie über die richtigen Header verfügen und dass Sie auch gültige JSON-Daten zurückgeben.

Hier ist das Beispielskript, mit dem Sie die JSON-Antwort vom Array PHP oder von der JSON-Datei zurückgeben können.

PHP Script (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 DATA):

{
    "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:

enter image description here

0
Neeraj Singh