Vreau să se întoarcă JSON de la un script PHP.
Am doar echo rezultatul? Trebuie să setați "Content-Type" header?
În timp ce're, de obicei, mai bine fără ea, puteți și ar trebui să setați antetul Content-Type:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
Dacă am'm nu folosesc un anumit cadru, îmi permit, de obicei, unele cerere params pentru a modifica ieșirea de comportament. Acesta poate fi util, în general, pentru depanare rapidă, pentru a nu trimite un antet, sau, uneori, print_r datele utilă a globului ocular (deși în cele mai multe cazuri, nu ar trebui't fi necesar).
Un complet de frumos și clar codul PHP revenind JSON este:
$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 );
Conform manual pejson_encode
metoda poate returna un non-string (fals):
Returnează un șir de caractere reprezentat JSON pe succesul sau "FALS" în caz de eșec.
Când acest lucru se întâmplă echo json_encode($date)
va de ieșire șir gol, care este invalid JSON.
json_encode
va, de exemplu, nu reușesc (și retur "false") dacă argumentul său conține un non-UTF-8 corzi.
Această condiție de eroare ar trebui să fie capturat în PHP, de exemplu, ca aceasta:
<?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;
?>
Apoi, la sfârșitul primirea de curs ar trebui să fie conștienți de faptul că prezența jsonError proprietate indică o condiție de eroare, care ar trebui să trateze în mod corespunzător.
În modul de producție ar fi mai bine pentru a trimite doar un generic starea de eroare a clientului și a vă conecta la mai multe mesaje de eroare specifice pentru investigații mai târziu.
Citeste mai multe despre de-a face cu JSON erori în PHP's Documentație.
Încerca json_encode pentru a codifica date și a stabilit conținutul-tip cu antet('Content-type: application/json');`.
Este, de asemenea, bun pentru a seta accesul de securitate - doar înlocuiți * cu domeniul pe care doriți să fie în măsură pentru a ajunge la ea.
<?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);
?>
Aici este mai multe probe pe care: https://stackoverflow.com/questions/7564832/how-to-bypass-access-control-allow-origin
Cum a spus mai sus:
header('Content-Type: application/json');
va face treaba. dar păstrează în minte faptul că :
Ajax va avea nici o problemă să citească json chiar dacă acest antet nu este utilizat, cu excepția json conține unele tag-uri HTML. În acest caz, aveți nevoie pentru a seta header ca application/json.
Asigurați-vă că fișierul nu este codat in UTF8-BOM. Acest format se adaugă un personaj în partea de sus a fișierului, astfel încât header() apelul va eșua.
Dacă aveți nevoie pentru a obține json de la php trimite informații personalizate puteți adăuga acest antet('Content-Type: application/json'); înainte de a imprima orice alt lucru, atunci puteți imprima ai custome echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
Acesta este un script PHP simplu să se întoarcă de sex masculin de sex feminin și id-ul de utilizator ca json valoare va fi orice valoare aleatoare ca ai sunat la script json.php .
Sper că acest ajutor multumesc
<?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;
?>
Dacă vă interoga o bază de date și au nevoie de rezultatul stabilit în format JSON se poate face astfel:
<?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);
?>
Pentru a ajuta în parsarea rezultatul folosind jQuery ia o privire la acest tutorial](https://kodesmart.com/kode/working-with-json-jquery-php-and-mysql).
O modalitate ușoară de a formata domeniu de obiecte JSON este de a utiliza Mareșalul Serializer.
Apoi trece datele de la json_encode
și trimite Conținutul corect de Tip antet pentru nevoile dumneavoastra.
Dacă utilizați un cadru ca Symfony, nu't nevoie pentru a avea grijă de stabilirea de antete manual. Nu puteți utiliza JsonResponse.
De exemplu corect Content-Type pentru a face cu Javascript ar fi aplicarea/javascript`.
Sau dacă aveți nevoie pentru a sprijini unele destul de vechi browsere cel mai sigur ar fi text/javascript
.
Pentru orice alte scopuri, cum ar fi o aplicație mobilă folosesc application/json` ca Tip de Conținut.
Aici este un mic exemplu:
<?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);
Puteți utiliza această pic de PHP library. Trimite anteturi și dă-te un obiect pentru a-l folosească cu ușurință.
Se pare ca :
<?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();
?>
O funcție simplă de a returna un răspuns JSON cu cod de stare HTTP.
`` funcția json_response($date=null, $httpStatus=200) { header_remove();
antet("Content-Type: application/json");
antet('Status: ' . $httpStatus);
http_response_code($httpStatus);
echo json_encode($date); } ``
Ori de câte ori încearcă să se întoarcă răspuns JSON pentru API sau altceva asigurați-vă că ați buna anteturi și, de asemenea, asigurați-vă că vă întoarceți JSON valid de date.
Aici este o mostră de script-ul care vă ajută să se întoarcă răspuns JSON de la matrice PHP sau din fișier JSON.
PHP Script (Cod):
``php <?php
// Set antetele necesare antet('Content-Type: application/json; charset=utf-8'); antet('Access-Control-Allow-Origin: *');
/**
// Obține date JSON de fișier JSON $json = file_get_contents('de răspuns.json');
// De ieșire, răspunsul echo $json;
/* =. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =. /
/**
// Sau de a construi de date JSON de la array (PHP) $json_var = [ 'hashtag' => 'HealthMatters', 'id' => '072b3d65-9168-49fd-a1c1-a4700fc017e0', 'sentimentele' => [ 'negativ' => 44, 'pozitiv' => 56, ], 'total' => '3400', 'utilizatorilor' => [ [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'screen_name' => 'rayalrumbel', 'text' => 'Tweet ca (O), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.', 'timestamp' => '{{$timestamp}}', ], [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'screen_name' => 'mikedingdong', 'text' => 'Tweet (B), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.', 'timestamp' => '{{$timestamp}}', ], [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'screen_name' => 'ScottMili', 'text' => 'Tweet (C), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.', 'timestamp' => '{{$timestamp}}', ], [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'screen_name' => 'yogibawa', 'text' => 'Tweet (D), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.', 'timestamp' => '{{$timestamp}}', ], ], ];
// De ieșire, răspunsul echo json_encode($json_var); ``
JSON Fișier (DATE JSON):
``json { "hashtag-ul": "HealthMatters", "id": "072b3d65-9168-49fd-a1c1-a4700fc017e0", "sentimentul de": { "negativ": 44, "pozitiv": 56 }, "total": "3400", "utilizatorilor": [ { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "screen_name": "rayalrumbel", "text": "Tweet ca (O), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.", "timestamp": "{{$timestamp}}" }, { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "screen_name": "mikedingdong", "text": "Tweet (B), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.", "timestamp": "{{$timestamp}}" }, { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "screen_name": "ScottMili", "text": "Tweet (C), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.", "timestamp": "{{$timestamp}}" }, { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "screen_name": "yogibawa", "text": "Tweet (D), #HealthMatters pentru că viața este rece :) Ne place această viață și doresc să-și petreacă mai mult.", "timestamp": "{{$timestamp}}" } ] }
``
JSON Screeshot: