Saya ingin mengembalikan JSON dari skrip PHP.
Apakah saya hanya mengulang hasilnya? Apakah saya harus mengatur Content-Type
tajuk?
Saya ingin mengembalikan JSON dari skrip PHP.
Apakah saya hanya mengulang hasilnya? Apakah saya harus mengatur Content-Type
tajuk?
Jawaban:
Meskipun biasanya Anda baik-baik saja tanpanya, Anda dapat dan harus mengatur header Tipe Konten:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
Jika saya tidak menggunakan kerangka kerja tertentu, saya biasanya mengizinkan beberapa params permintaan untuk mengubah perilaku keluaran. Ini bisa berguna, umumnya untuk pemecahan masalah cepat, untuk tidak mengirim header, atau kadang-kadang print_r muatan data untuk melihatnya (meskipun dalam kebanyakan kasus, itu tidak perlu).
header('Content-type:application/json;charset=utf-8');
Sepotong lengkap kode PHP yang bagus dan jelas mengembalikan JSON adalah:
$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 );
Menurut manual padajson_encode
metode ini dapat mengembalikan non-string ( false ):
Mengembalikan string yang disandikan JSON pada keberhasilan atau
FALSE
kegagalan.
Ketika ini terjadi echo json_encode($data)
akan menampilkan string kosong, yang tidak valid JSON .
json_encode
misalnya akan gagal (dan kembali false
) jika argumennya berisi string non UTF-8.
Kondisi kesalahan ini harus ditangkap dalam PHP, misalnya seperti ini:
<?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;
?>
Maka pihak penerima tentu harus menyadari bahwa keberadaan properti jsonError menunjukkan kondisi kesalahan, yang harus diperlakukan sesuai.
Dalam mode produksi, mungkin lebih baik untuk mengirim hanya status kesalahan umum ke klien dan mencatat pesan kesalahan yang lebih spesifik untuk penyelidikan selanjutnya.
Baca lebih lanjut tentang berurusan dengan kesalahan JSON dalam Dokumentasi PHP .
charset
parameter untuk JSON; lihat catatan di akhir tools.ietf.org/html/rfc8259#section-11 : "Tidak ada parameter 'charset' yang ditentukan untuk pendaftaran ini. Menambahkan satu benar-benar tidak berpengaruh pada penerima yang patuh." (JSON harus ditransmisikan sebagai UTF-8 per tools.ietf.org/html/rfc8259#section-8.1 , jadi sebutkan bahwa itu disandikan sebagai UTF-8 agak berlebihan.)
charset
Parameter redundan dihapus dari string header HTTP.
Coba json_encode untuk menyandikan data dan mengatur tipe konten dengan header('Content-type: application/json');
.
Juga baik untuk mengatur keamanan akses - cukup ganti * dengan domain yang Anda inginkan untuk mencapainya.
<?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);
?>
Berikut adalah lebih banyak sampel tentang itu: bagaimana cara memotong Access-Control-Allow-Origin?
Seperti dikatakan di atas:
header('Content-Type: application/json');
akan membuat pekerjaan. tetapi perlu diingat bahwa:
Ajax tidak akan memiliki masalah untuk membaca json bahkan jika header ini tidak digunakan, kecuali jika json Anda mengandung beberapa tag HTML. Dalam hal ini Anda perlu mengatur header sebagai aplikasi / json.
Pastikan file Anda tidak dikodekan dalam UTF8-BOM. Format ini menambahkan karakter di bagian atas file, sehingga panggilan tajuk () Anda akan gagal.
Fungsi sederhana untuk mengembalikan respons JSON dengan kode status HTTP .
function json_response($data=null, $httpStatus=200)
{
header_remove();
header("Content-Type: application/json");
http_response_code($httpStatus);
echo json_encode($data);
exit();
}
header_remove
, dan secara eksplisit mengatur respons http adalah ide yang bagus; meskipun pengaturan status dan kemudian http_response tampaknya berlebihan. Mungkin juga ingin menambahkan exit
pernyataan sampai akhir. Saya menggabungkan fungsi Anda dengan @trincot: stackoverflow.com/a/35391449/339440
Jawaban untuk pertanyaan Anda ada di sini ,
Ia mengatakan.
Jenis media MIME untuk teks JSON adalah application / json.
jadi jika Anda mengatur header ke tipe itu, dan output string JSON Anda, itu akan berfungsi.
Ya, Anda harus menggunakan gema untuk menampilkan output. Mimetype: application / json
Jika Anda perlu mendapatkan json dari php mengirimkan informasi khusus, Anda dapat menambahkan ini header('Content-Type: application/json');
sebelum mencetak hal lain, Jadi, Anda dapat mencetak Anda customeecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
Jika Anda meminta basis data dan memerlukan hasil yang ditetapkan dalam format JSON, itu bisa dilakukan seperti ini:
<?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);
?>
Untuk bantuan dalam mem-parsing hasil menggunakan jQuery lihat tutorial ini .
Ini adalah skrip PHP sederhana untuk mengembalikan id perempuan dan pengguna sebagai nilai json akan menjadi nilai acak apa pun saat Anda memanggil skrip json.php.
Semoga bantuan ini terimakasih
<?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;
?>
Cara mudah untuk memformat objek domain Anda ke JSON adalah dengan menggunakan Marshal Serializer . Kemudian json_encode
kirimkan data ke dan kirim tajuk Jenis Konten yang benar untuk kebutuhan Anda. Jika Anda menggunakan kerangka kerja seperti Symfony, Anda tidak perlu mengurus pengaturan header secara manual. Di sana Anda dapat menggunakan JsonResponse .
Misalnya, Tipe-Konten yang benar untuk menangani Javascript adalah application/javascript
.
Atau jika Anda perlu mendukung beberapa browser yang cukup lama yang paling aman text/javascript
.
Untuk semua keperluan lain seperti penggunaan aplikasi seluler application/json
sebagai Tipe-Konten.
Ini adalah contoh kecil:
<?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);
Setiap kali Anda mencoba mengembalikan respons JSON untuk API atau pastikan Anda memiliki tajuk yang tepat dan juga pastikan Anda mengembalikan data JSON yang valid.
Berikut ini contoh skrip yang membantu Anda mengembalikan respons JSON dari array PHP atau dari file JSON.
Script PHP (Kode):
<?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);
File 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}}"
}
]
}
JSON Screeshot:
Anda dapat menggunakan perpustakaan PHP kecil ini . Mengirim header dan memberi Anda objek untuk menggunakannya dengan mudah.
Sepertinya :
<?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();
?>