Retour de JSON à partir D'un Script PHP

je veux rendre JSON à partir d'un script PHP.

est-ce que je fais juste écho au résultat? Dois-je mettre l'en-tête Content-Type ?

657
demandé sur dakab 2010-10-31 21:23:54

15 réponses

alors que vous êtes généralement bien sans elle, vous pouvez et devriez définir l'en-tête Content-Type:

<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);

si je n'utilise pas un framework particulier, j'autorise habituellement certains params de requête à modifier le comportement de sortie. Il peut être utile, généralement pour un dépannage rapide, de ne pas envoyer un en-tête, ou parfois d'Imprimer la charge utile de données à l'oeil (bien que dans la plupart des cas, il ne devrait pas être nécessaire).

1207
répondu timdev 2017-09-21 11:02:32

un morceau complet de code PHP agréable et clair de retour JSON est:

$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 );
99
répondu aesede 2016-10-26 13:37:02

Essayer json_encode pour coder les données et de définir le type de contenu avec header('Content-type: application/json'); .

34
répondu thejh 2010-10-31 18:27:03

selon le manuel sur json_encode la méthode peut retourner une non-chaîne ( false ):

renvoie une chaîne codée JSON sur success ou FALSE sur failure.

quand cela se produit echo json_encode($data) affichera la chaîne vide, qui est JSON invalide .

json_encode échouera (et retournera false ) si son argument contient une chaîne non UTF-8.

cette condition d'erreur doit être capturée en PHP, par exemple comme ceci:

<?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;
?>

alors le destinataire doit bien sûr être conscient que la présence de la propriété jsonError indique une condition d'erreur, qu'il doit traiter en conséquence.

en mode production, il serait peut-être préférable de n'envoyer qu'un statut d'erreur générique au client et enregistrer les messages d'erreur plus spécifiques pour une enquête ultérieure.

plus d'informations sur le traitement des erreurs JSON dans documentation de PHP .

32
répondu trincot 2018-02-10 07:51:24

définit le type de contenu avec header('Content-type: application/json'); et ensuite echo vos données.

13
répondu Brad Mace 2010-10-31 18:26:13

il est également bon de définir la sécurité d'accès - il suffit de remplacer * par le domaine que vous voulez pouvoir y accéder.

<?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); 
?>

Voici d'autres exemples: comment contourner Access-Control-Allow-Origin?

6
répondu Dr. Aaron Dishno 2017-09-01 14:53:47

la réponse à votre question est ici ,

ça dit.

le type de média MIME pour le texte JSON est application / json.

donc si vous définissez l'en-tête à ce type, et que vous produisez votre chaîne JSON, cela devrait fonctionner.

3
répondu Codemwnci 2017-05-23 12:02:48

comme dit ci-dessus:

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

fera l'affaire. mais gardez à l'esprit que :

  • Ajax n'aura aucun problème pour lire json même si cet en-tête n'est pas utilisé, sauf si votre json contient des balises HTML. Dans ce cas, vous devez définir l'en-tête d'application/json.

  • assurez-vous que votre fichier N'est pas encodé en UTF8-BOM. Ce format ajoute un caractère en haut du fichier, donc votre appel d'en-tête() échouera.

2
répondu Tom Ah 2016-12-28 20:17:09

il s'agit d'un simple script PHP pour rendre mâle female et user id comme valeur json sera n'importe quelle valeur aléatoire que vous appelez le script JSON.php .

Espérons que cette aide grâce

<?php
header("Content-type: text/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;
?>
2
répondu Bidyashish Kumar 2017-09-12 02:16:26

si vous avez besoin d'obtenir json de php l'envoi d'informations personnalisées, vous pouvez ajouter ce header('Content-Type: application/json'); avant d'imprimer toute autre chose, alors vous pouvez imprimer vous custome echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';

1
répondu jacr1614 2015-10-29 13:57:06

Oui, vous aurez besoin d'utiliser echo pour afficher la sortie. Type mime: application/json

0
répondu Nev Stokes 2010-10-31 18:26:45

vous pouvez utiliser ce petite bibliothèque PHP . Il envoie les en-têtes et donnez-vous un objet pour l'utiliser facilement.

Il ressemble à :

<?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
répondu Alexis Paques 2015-04-28 16:37:48

Oui, il suffit de définir les en-tête HTTP, echo le résultat, et puis la sortie du script.

0
répondu Spencer Williams 2017-08-18 22:10:14

si vous interrogez une base de données et avez besoin du résultat au format JSON, il peut être fait comme ceci:

<?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);

?>

pour de l'aide dans l'analyse du résultat en utilisant jQuery jetez un oeil à ce tutoriel .

0
répondu Eyece 2017-10-17 23:25:42

un moyen facile de formater vos objets de domaine à JSON est d'utiliser le Marshal Serializer . Ensuite, passez les données à json_encode et envoyez l'en-tête Content-Type correct pour vos besoins. Si vous utilisez un framework comme Symfony, vous n'avez pas besoin de prendre soin de fixer les en-têtes manuellement. Là, vous pouvez utiliser le JsonResponse .

par exemple, le type de contenu correct pour traiter avec Javascript serait application/javascript .

ou si vous avez besoin de prendre en charge certains navigateurs assez anciens, le plus sûr serait text/javascript .

pour tout autre usage comme une application mobile, utilisez application/json comme type de contenu.

Voici un petit exemple:

<?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
répondu Kingson 2017-12-05 23:11:19