Retourner JSON à partir d'un script PHP


879

Je veux retourner JSON à partir d'un script PHP.

Dois-je simplement faire écho au résultat? Dois-je définir l'en- Content-Typetête?

Réponses:


1607

Bien que vous soyez généralement bien sans cela, vous pouvez et devez 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 cadre particulier, j'autorise généralement certains paramètres de demande à modifier le comportement de sortie. Il peut être utile, généralement pour un dépannage rapide, de ne pas envoyer d'en-tête, ou parfois d'imprimer la charge utile de données pour le surveiller (bien que dans la plupart des cas, cela ne devrait pas être nécessaire).


9
juste au cas où: vous ne devriez utiliser les commandes header () qu'en plus avec la mise en mémoire tampon de sortie pour éviter les avertissements "en-têtes déjà envoyés"
Kevin

6
Le fichier php doit être encodé en UTF-8 sans BOM :)
Krzysztof Kalinowski

217
header('Content-type:application/json;charset=utf-8');
Timo Huovinen

14
@mikepote En fait, je ne pense pas qu'il soit nécessaire d'avoir la commande d'en-tête en haut du fichier PHP. Si vous crachez des choses par inadvertance et que cela déclenche votre commande d'en-tête, il vous suffit de corriger votre code car il est cassé.
Halfstop

8
@KrzysztofKalinowski non, le fichier PHP n'a pas besoin d'être encodé en UTF-8. la sortie DOIT être codée en UTF-8. Ces déclarations erronées n'aident pas les utilisateurs non expérimentés à apprendre comment éviter que les choses ne se cassent, mais elles aident à développer des mythes à leur sujet et à ne jamais apprendre quel rôle les encodages jouent sur les flux et comment ils fonctionnent.
Áxel Costas Pena

124

Un morceau complet de code PHP agréable et clair renvoyant 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 );

44

Selon le manuel surjson_encode la méthode peut renvoyer une non-chaîne ( faux ):

Renvoie une chaîne codée JSON en cas de succès ou FALSEd'échec.

Lorsque cela se echo json_encode($data)produit, la chaîne vide sera sortie, ce qui n'est pas JSON non valide .

json_encodeéchouera (et reviendra false) par exemple 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(["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;
?>

Ensuite, l'extrémité de réception doit bien sûr être consciente que la présence de la propriété jsonError indique une condition d'erreur, qu'elle doit traiter en conséquence.

En mode production, il peut être préférable d'envoyer uniquement un état d'erreur générique au client et de consigner les messages d'erreur plus spécifiques pour une enquête ultérieure.

En savoir plus sur la gestion des erreurs JSON dans la documentation de PHP .


2
Il n'y a pas de charsetparamètre pour JSON; voir la note à la fin de tools.ietf.org/html/rfc8259#section-11 : "Aucun paramètre 'charset' n'est défini pour cet enregistrement. L'ajout d'un n'a vraiment aucun effet sur les destinataires conformes." (JSON doit être transmis en UTF-8 par tools.ietf.org/html/rfc8259#section-8.1 , donc spécifier qu'il est encodé en UTF-8 est un peu redondant.)
Patrick Dark

1
Merci d'avoir souligné cela, @PatrickDark. charsetParamètre redondant supprimé de la chaîne d'en-tête HTTP.
trincot

38

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


15

Définissez le type de contenu avec header('Content-type: application/json');, puis faites écho à vos données.


12

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

<?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 plus d'exemples à ce sujet: comment contourner Access-Control-Allow-Origin?


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

Quelle est la différence en indiquant le jeu de caractères dans l'en-tête? Veuillez expliquer, merci.
Sanxofon

6

Comme dit ci-dessus:

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

fera le travail. mais gardez à l'esprit que:

  • Ajax n'aura aucun problème à 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 comme application / json.

  • Assurez-vous que votre fichier n'est pas codé en UTF8-BOM. Ce format ajoute un caractère en haut du fichier, donc votre appel header () échouera.


4

Une fonction simple pour renvoyer une réponse JSON avec le code d'état HTTP .

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

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

    http_response_code($httpStatus);

    echo json_encode($data);

    exit();
}

1
header_removeet définir explicitement la réponse http est une bonne idée; bien que définir le statut puis http_response semble redondant. Pourrait également vouloir ajouter une exitdéclaration à la fin. J'ai combiné votre fonction avec celle de @trincot: stackoverflow.com/a/35391449/339440
Stephen R

Merci pour la suggestion. Je viens de mettre à jour la réponse.
Dan

3

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 sur ce type et que vous sortez votre chaîne JSON, cela devrait fonctionner.


1

Oui, vous devrez utiliser l'écho pour afficher la sortie. Type MIME: application / json


1

Si vous devez obtenir json de php en envoyant des informations personnalisées, vous pouvez l'ajouter header('Content-Type: application/json');avant d'imprimer autre chose, alors vous pouvez imprimer votre customeecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';


1

Si vous interrogez une base de données et avez besoin du jeu de résultats au format JSON, cela 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 obtenir de l'aide sur l'analyse du résultat à l'aide de jQuery, consultez ce didacticiel .


1

Il s'agit d'un simple script PHP pour renvoyer un identifiant mâle femelle et un identifiant utilisateur, car la valeur json sera une valeur aléatoire lorsque vous appellerez le script json.php.

J'espère que cette aide merci

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

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

0

Un moyen simple de formater vos objets de domaine en JSON est d'utiliser le Marshal Serializer . Passez ensuite les données à json_encodeet envoyez l'en-tête Content-Type correspondant à vos besoins. Si vous utilisez un framework comme Symfony, vous n'avez pas besoin de régler manuellement les en-têtes. Là, vous pouvez utiliser JsonResponse .

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

Ou si vous devez prendre en charge certains navigateurs assez anciens, le plus sûr serait text/javascript.

À toutes autres fins, comme une application mobile, utilisez application/jsonle 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

Chaque fois que vous essayez de renvoyer une réponse JSON pour l'API, sinon assurez-vous que vous disposez des en-têtes appropriés et assurez-vous également de renvoyer des données JSON valides.

Voici l'exemple de script qui vous aide à renvoyer la réponse JSON à partir d'un tableau PHP ou d'un fichier JSON.

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

Fichier JSON (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}}"
        }
    ]
}

Capture d'écran JSON:

entrez la description de l'image ici


-1

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

On dirait :

<?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();
?>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.