Retour de JSON à partir D'un Script PHP
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).
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 );
Essayer json_encode pour coder les données et de définir le type de contenu avec header('Content-type: application/json');
.
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 .
définit le type de contenu avec header('Content-type: application/json');
et ensuite echo vos données.
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?
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.
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;
?>
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.'"}';
Oui, vous aurez besoin d'utiliser echo pour afficher la sortie. Type mime: application/json
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();
?>
Oui, il suffit de définir les en-tête HTTP, echo le résultat, et puis la sortie du script.
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 .
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);