Aku ingin kembali JSON dari script PHP.
Apakah saya hanya echo hasilnya? Apakah saya harus mengatur Content-Type
header?
Sementara anda're biasanya baik-baik saja tanpa itu, anda dapat dan harus mengatur header Content-Type:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
Jika saya'm tidak menggunakan kerangka tertentu, saya biasanya memungkinkan beberapa permintaan params untuk memodifikasi output perilaku. Hal ini dapat berguna, umumnya untuk mengatasi masalah cepat, untuk tidak mengirim header, atau kadang-kadang print_r data payload untuk bola mata itu (meskipun dalam kebanyakan kasus, seharusnya't perlu).
Sepotong lengkap bagus dan jelas kode PHP 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 dapat kembali non-string (palsu):
Mengembalikan JSON string dikodekan pada keberhasilan atau
PALSU
pada kegagalan.
Ketika ini terjadi echo json_encode($data)
akan output string kosong, yang tidak valid JSON.
json_encode
akan misalnya gagal (dan kembali false
) jika argumen berisi non UTF-8 string.
Kondisi kesalahan ini harus ditangkap di 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(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;
?>
Kemudian ujung penerima tentunya harus menyadari bahwa kehadiran jsonError properti menunjukkan kondisi kesalahan, yang harus memperlakukan sesuai.
Dalam mode produksi itu mungkin lebih baik untuk hanya mengirim generic error status klien dan log yang lebih spesifik pesan kesalahan untuk penyelidikan lebih lanjut.
Baca lebih lanjut tentang berurusan dengan JSON kesalahan dalam PHP's Dokumentasi.
Mencoba json_encode untuk menyandikan data dan mengatur content-type dengan header('Content-type: application/json');
.
Hal ini juga baik untuk mengatur akses keamanan - hanya ganti * dengan domain yang anda ingin untuk dapat mencapai hal itu.
<?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 sampel lebih pada bahwa: https://stackoverflow.com/questions/7564832/how-to-bypass-access-control-allow-origin
Seperti dikatakan di atas:
header('Content-Type: application/json');
akan membuat pekerjaan. namun perlu diingat bahwa :
Ajax tidak akan memiliki masalah untuk membaca json bahkan jika header ini tidak digunakan, kecuali jika anda json berisi beberapa tag HTML. Dalam hal ini anda perlu untuk mengatur header sebagai application/json.
Pastikan file anda tidak dikodekan dalam UTF8-BOM. Format ini menambahkan karakter di bagian atas file, sehingga anda header() call akan gagal.
Jika anda perlu untuk mendapatkan json dari php untuk mengirim informasi kustom anda dapat menambahkan ini header('Content-Type: application/json');
sebelum mencetak hal lainnya, Sehingga kemudian dapat anda cetak anda custome echo '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
Ini adalah script PHP sederhana untuk kembali laki-laki perempuan dan user id sebagai json nilai yang akan menjadi nilai acak seperti yang anda sebut script json.php .
Semoga ini bisa membantu terima kasih
<?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;
?>
Jika anda query database dan perlu menetapkan hasil dalam format JSON ini dapat 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 membantu dalam penguraian hasil dengan menggunakan jQuery kita lihat di tutorial.
Cara mudah untuk format domain anda objek JSON adalah dengan menggunakan Marsekal Serializer.
Kemudian melewati data ke json_encode
dan mengirim benar header Content-Type untuk kebutuhan anda.
Jika anda menggunakan framework seperti Symfony, anda don't perlu untuk mengurus pengaturan header secara manual. Di sana anda dapat menggunakan JsonResponse.
Untuk contoh yang benar Content-Type untuk berurusan dengan Javascript akan menjadi aplikasi/javascript
.
Atau jika anda perlu untuk mendukung beberapa browser lama paling aman akan text/javascript
.
Untuk semua keperluan lainnya seperti penggunaan aplikasi mobile application/json
sebagai Content-Type.
Berikut 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);
Anda dapat menggunakan ini sedikit perpustakaan PHP. Ia mengirimkan header dan memberikan anda sebuah objek untuk menggunakannya dengan mudah.
Itu terlihat seperti :
<?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();
?>
Fungsi sederhana untuk kembali respon JSON dengan kode status HTTP.
`` fungsi json_response($data=null, $httpStatus=200) { header_remove();
header("Content-Type: application/json");
header('Status: ' . $httpStatus);
http_response_code($httpStatus);
echo json_encode($data); } ``
Setiap kali anda mencoba untuk kembali respon JSON untuk API atau yang lain, pastikan anda memiliki tepat header dan juga pastikan anda kembali yang valid data JSON.
Berikut ini adalah contoh script yang akan membantu anda untuk mengembalikan JSON respon dari array PHP atau dari file JSON.
PHP Script (Kode):
``php <?php
// Set diperlukan header header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: *');
/**
// Dapatkan data JSON dari file JSON $json = file_get_contents('respon.json');
// Output, respon echo $json;
/* =. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =. /
/**
// Atau membangun JSON data dari array (PHP) $json_var = [ 'hashtag' => 'HealthMatters', 'id' => '072b3d65-9168-49fd-a1c1-a4700fc017e0', 'sentimen' => [ 'negatif' => 44, 'positif' => 56, ], 'total' => '3400', 'pengguna' => [ [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'nama_layar' => 'rayalrumbel', 'text' => 'Tweet (A), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.', 'timestamp' => '{{$timestamp}}', ], [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'nama_layar' => 'mikedingdong', 'text' => 'Tweet (B), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.', 'timestamp' => '{{$timestamp}}', ], [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'nama_layar' => 'ScottMili', 'text' => 'Tweet (C), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.', 'timestamp' => '{{$timestamp}}', ], [ 'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg', 'nama_layar' => 'yogibawa', 'text' => 'Tweet (D), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.', 'timestamp' => '{{$timestamp}}', ], ], ];
// Output, respon echo json_encode($json_var); ``
JSON File (DATA JSON):
``json { "hashtag": "HealthMatters", "id": "072b3d65-9168-49fd-a1c1-a4700fc017e0", "sentimen": { "negatif": 44, "positif": 56 }, "total": "3400", "user": [ { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "nama_layar": "rayalrumbel", "text": "Tweet (A), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.", "timestamp": "{{$timestamp}}" }, { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "nama_layar": "mikedingdong", "text": "Tweet (B), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.", "timestamp": "{{$timestamp}}" }, { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "nama_layar": "ScottMili", "text": "Tweet (C), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.", "timestamp": "{{$timestamp}}" }, { "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", "nama_layar": "yogibawa", "text": "Tweet (D), #HealthMatters karena hidup ini keren :) Kita mencintai kehidupan ini dan ingin menghabiskan lebih banyak.", "timestamp": "{{$timestamp}}" } ] }
``
JSON Screeshot: