Terugkeren van JSON van een PHP-script

Ik wil JSON terugkeren van een PHP-script.

Doe ik gewoon het resultaat? Moet ik de Content-Typeheader instellen?


Antwoord 1, Autoriteit 100%

Hoewel u meestal goed bent zonder dat, kunt u en moet en moet u de Content-Typeheader instellen:

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

Als ik geen specifiek raamwerk gebruik, laat ik meestal enkele aanvraagparamumenten toe om het uitgangsgedrag te wijzigen. Het kan handig zijn, in het algemeen voor snelle probleemoplossing, om een ​​koptekst niet te verzenden, of soms print_rde data-payload naar oogbol het (hoewel in de meeste gevallen niet noodzakelijk zou moeten zijn).


Antwoord 2, Autoriteit 7%

Een compleet stukje Nice en Clear Php-code die JSON terugkeert, is:

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

Antwoord 3, Autoriteit 3%

Volgens de handleiding op json_encodeDe methode kan een non-string retourneren (false ):

Retourneert een JSON-gecodeerde reeks op succes of falseop falen.

Als dit gebeurt, zal echo json_encode($data)de lege tekenreeks uitvoeren, namelijk ongeldige JSON.

json_encodezal bijvoorbeeld mislukken (en retourneert false) als het argument een niet-UTF-8-tekenreeks bevat.

Deze foutconditie moet worden vastgelegd in PHP, bijvoorbeeld als volgt:

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

Dan moet de ontvangende partij zich er natuurlijk van bewust zijn dat de aanwezigheid van de eigenschap jsonErroreen foutconditie aangeeft, die dienovereenkomstig moet worden behandeld.

In productiemodus is het misschien beter om alleen een generieke foutstatus naar de klant te sturen en de meer specifieke foutmeldingen te loggen voor later onderzoek.

Lees meer over het omgaan met JSON-fouten in PHP-documentatie.


Antwoord 4, autoriteit 2%

Probeer json_encodeom de gegevens te coderen en de inhoud in te stellen- typ met header('Content-type: application/json');.


Antwoord 5

Het is ook goed om de toegangsbeveiliging in te stellen – vervang * gewoon door het domein dat u wilt bereiken.

<?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 zijn meer voorbeelden: hoe Access-Control-Allow te omzeilen -Oorsprong?


Antwoord 6

Stel het inhoudstype in met header('Content-type: application/json');en herhaal uw gegevens.


Antwoord 7

Deze vraag kreeg veel antwoorden, maar geen enkele dekt het hele proces om schone JSON te retourneren met alles wat nodig is om te voorkomen dat de JSON-reactie onjuist wordt opgemaakt.


/*
 * returnJsonHttpResponse
 * @param $success: Boolean
 * @param $data: Object or Array
 */
function returnJsonHttpResponse($success, $data)
{
    // remove any string that could create an invalid JSON 
    // such as PHP Notice, Warning, logs...
    ob_clean();
    // this will clean up any previously added headers, to start clean
    header_remove(); 
    // Set the content type to JSON and charset 
    // (charset can be set to something else)
    header("Content-type: application/json; charset=utf-8");
    // Set your HTTP response code, 2xx = SUCCESS, 
    // anything else will be error, refer to HTTP documentation
    if ($success) {
        http_response_code(200);
    } else {
        http_response_code(500);
    }
    // encode your PHP Object or Array into a JSON string.
    // stdClass or array
    echo json_encode($data);
    // making sure nothing is added
    exit();
}

Referenties:

response_remove

ob_clean

Content-type JSON

HTTP-codes

http_response_code

json_encode


Antwoord 8

Een eenvoudige functie om een JSON-antwoordte retourneren met de HTTP-statuscode.

function json_response($data=null, $httpStatus=200)
{
    header_remove();
    header("Content-Type: application/json");
    http_response_code($httpStatus);
    echo json_encode($data);
    exit();
}

Antwoord 9

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

Antwoord 10

Zoals hierboven gezegd:

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

zal de klus klaren. maar onthoud dat:

  • Ajax zal geen probleem hebben om json te lezen, zelfs als deze header niet wordt gebruikt, behalve als uw json enkele HTML-tags bevat. In dit geval moet je de header instellen als application/json.

  • Zorg ervoor dat uw bestand niet is gecodeerd in UTF8-BOM. Dit formaat voegt een teken toe bovenaan het bestand, zodat je header()-aanroep zal mislukken.


Antwoord 11

Het antwoord op uw vraag is hier,

Er staat.

Het MIME-mediatype voor JSON-tekst is
applicatie/json.

dus als je de header op dat type instelt en je JSON-string uitvoert, zou het moeten werken.


Antwoord 12

Als je json van php moet krijgen om aangepaste informatie te verzenden, kun je deze header('Content-Type: application/json');toevoegen voordat je iets anders wilt afdrukken, dus dan kun je afdrukken je custome echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';


Antwoord 13

Ja, je moet echo gebruiken om de uitvoer weer te geven. Mimetype: application/json


Antwoord 14

Als u een database opvraagt en de resultatenset in JSON-indeling nodig heeft, kunt u dit als volgt doen:

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

Voor hulp bij het ontleden van het resultaat met jQuery, ga naar deze handleiding.


Antwoord 15

Dit is een eenvoudig PHP-script om mannelijk vrouwelijk en gebruikers-ID terug te geven, aangezien de json-waarde elke willekeurige waarde is zoals u het script json.php noemt.

Ik hoop dat deze hulp bedankt

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

Antwoord 16

Een gemakkelijke manier om uw domeinobjecten naar JSON op te maken, is door de Marshal Serializer.
Geef vervolgens de gegevens door aan json_encodeen stuur de juiste Content-Type-header voor uw behoeften.
Als u een framework zoals Symfony gebruikt, hoeft u de headers niet handmatig in te stellen. Daar kun je de JsonResponsegebruiken .

Het juiste inhoudstype voor het omgaan met Javascript is bijvoorbeeld application/javascript.

Of als je een paar behoorlijk oude browsers moet ondersteunen, is text/javascriptde veiligste.

Gebruik voor alle andere doeleinden, zoals een mobiele app, application/jsonals het inhoudstype.

Hier is een klein voorbeeld:

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

Antwoord 17

Telkens wanneer u probeert een JSON-antwoord voor API te retourneren, of zorg ervoor dat u de juiste headers heeft en zorg er ook voor dat u geldige JSON-gegevens retourneert.

Hier is het voorbeeldscript waarmee u een JSON-antwoord kunt retourneren vanuit een PHP-array of
uit JSON-bestand.

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-bestand (JSON-gegevens):

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


Antwoord 18

Als u dit in WordPress doet, is er een eenvoudige oplossing:

add_action( 'parse_request', function ($wp) {
    $data = /* Your data to serialise. */
    wp_send_json_success($data); /* Returns the data with a success flag. */
    exit(); /* Prevents more response from the server. */
})

Merk op dat dit niet in de wp_headhaak is, die altijd het grootste deel van het hoofd zal retourneren, zelfs als u onmiddellijk afsluit. De parse_requestkomt veel eerder in de reeks.


Antwoord 19

U kunt deze kleine PHP-bibliotheek gebruiken. Het stuurt de kopteksten en geeft u een object om het gemakkelijk te gebruiken.

Het ziet eruit als:

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

Other episodes