web-dev-qa-db-fra.com

Renvoi de JSON à partir d'un script PHP

Je souhaite renvoyer JSON à partir d'un script PHP.

Est-ce que je répète le résultat? Dois-je définir l'en-tête Content-Type?

782
Scott Nicol

Bien que cela ne vous dérange généralement pas, 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 de framework particulier, j'autorise généralement certains paramètres de requête à modifier le comportement de la 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 l’observer (bien que dans la plupart des cas, cela ne devrait pas être nécessaire).

1422
timdev

Un élément complet du code PHP renvoyant le code JSON est agréable et clair:

$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

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

38
thejh

Selon le manuel sur json_encode , la méthode peut renvoyer une non-chaîne ( false ):

Retourne une chaîne encodée JSON en cas de succès ou FALSE en cas d'échec.

Lorsque cela se produit, echo json_encode($data) génère la chaîne vide, qui est JSON non valide .

json_encode échouera par exemple (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;
?>

Ensuite, le destinataire doit bien entendu savoir que la présence de la propriété jsonError indique une condition d'erreur, qu'elle doit traiter en conséquence.

En mode de production, il peut être préférable d’envoyer uniquement un statut 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 le traitement des erreurs JSON dans Documentation PHP .

37
trincot

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

15
Brad Mace

Il est également bon de définir la sécurité d'accès - remplacez simplement * 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 d'autres exemples à ce sujet: comment contourner Access-Control-Allow-Origin?

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

Comme dit ci-dessus:

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

fera le travail. 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 comme application/json.

  • Assurez-vous que votre fichier n'est pas encodé en UTF8-BOM. Ce format ajoute un caractère en haut du fichier pour que votre appel à header () échoue.

4
Tom Ah

La réponse à votre question est ici ,

Ça dit.

Le type de support MIME pour le texte JSON est application/json.

par conséquent, si vous définissez l'en-tête sur ce type et que vous générez votre chaîne JSON, cela devrait fonctionner.

3
Codemwnci

Si vous avez besoin d’obtenir un json de php en envoyant des informations personnalisées, vous pouvez ajouter ceci header('Content-Type: application/json'); avant d’imprimer quoi que ce soit, afin que vous puissiez alors imprimer votre contenu echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';

1
jacr1614

Ceci est un simple script PHP pour renvoyer une femme et un identifiant d'utilisateur en tant que valeur json sera n'importe quelle valeur aléatoire lorsque vous appelez 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;
?>
1
Bidyashish Kumar

Oui, vous aurez besoin d'utiliser l'écho pour afficher la sortie. Type Mimet: application/json

1
Nev Stokes

Un moyen simple de formater vos objets de domaine en JSON consiste à utiliser Marshal Serializer . Puis passez les données à json_encode et envoyez l'en-tête Content-Type approprié à vos besoins. Si vous utilisez un framework tel que Symfony, vous n'avez pas besoin de définir manuellement les en-têtes. Là, vous pouvez utiliser le JsonResponse .

Par exemple, le type de contenu correct pour gérer Javascript devrait être application/javascript.

Ou si vous avez besoin de supporter de très vieux navigateurs, le plus sûr serait text/javascript.

Pour toute autre utilisation, telle qu'une application mobile, utilisez application/json en tant que 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
Kingson

Vous pouvez utiliser ceci 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();
?>
0
Alexis Paques

Si vous interrogez une base de données et que vous avez besoin du jeu de résultats au format JSON, procédez comme suit:

<?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 vous aider à analyser le résultat avec jQuery, jetez un œil à ce tutoriel .

0
Eyece

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

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

Chaque fois que vous essayez de renvoyer une réponse JSON pour une API, assurez-vous que vous avez les en-têtes appropriés et que vous renvoyez des données JSON valides.

Voici un exemple de script permettant de renvoyer une 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 (DONNÉES JSON):

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