Mengembalikan JSON dari Skrip PHP

877

Saya ingin mengembalikan JSON dari skrip PHP.

Apakah saya hanya mengulang hasilnya? Apakah saya harus mengatur Content-Typetajuk?

Scott Nicol
sumber

Jawaban:

1605

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).

timdev
sumber
9
untuk jaga-jaga: Anda harus menggunakan perintah header () hanya di samping dengan buffering output untuk menghindari peringatan "header sudah terkirim"
Kevin
6
File php harus dikodekan dalam UTF-8 tanpa BOM :)
Krzysztof Kalinowski
217
header('Content-type:application/json;charset=utf-8');
Timo Huovinen
14
@mikepote Saya sebenarnya tidak berpikir perlu memiliki perintah header di bagian atas file PHP. Jika Anda secara tidak sengaja memuntahkan barang-barang dan itu melanggar perintah tajuk Anda, Anda hanya perlu memperbaiki kode Anda karena itu rusak.
Halfstop
8
@ KrzysztofKalinowski tidak, file PHP tidak perlu dikodekan UTF-8. output HARUS dikodekan UTF-8. Pernyataan yang salah itu tidak membantu pengguna yang tidak berpengalaman untuk belajar cara menghindari hal-hal dari kerusakan, tetapi membantu menumbuhkan mitos pada mereka dan tidak pernah belajar peran yang dimainkan encodings pada stream dan bagaimana mereka bekerja.
Áxel Costas Pena
124

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 );
aesede
sumber
44

Menurut manual padajson_encode metode ini dapat mengembalikan non-string ( false ):

Mengembalikan string yang disandikan JSON pada keberhasilan atau FALSEkegagalan.

Ketika ini terjadi echo json_encode($data)akan menampilkan string kosong, yang tidak valid JSON .

json_encodemisalnya 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 .

trincot
sumber
2
Tidak ada charsetparameter 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.)
Patrick Dark
1
Terima kasih telah menyoroti itu, @ Patrickrick. charsetParameter redundan dihapus dari string header HTTP.
trincot
38

Coba json_encode untuk menyandikan data dan mengatur tipe konten dengan header('Content-type: application/json');.

thejh
sumber
15

Setel jenis konten dengan header('Content-type: application/json');lalu gema data Anda.

Brad Mace
sumber
12

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?

Aaron Dishno
sumber
7
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
Setia
sumber
Apa perbedaan menyatakan charset di header? Tolong jelaskan, terima kasih.
Sanxofon
6

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.

Tom Ah
sumber
4

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();
}
Dan
sumber
1
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 exitpernyataan sampai akhir. Saya menggabungkan fungsi Anda dengan @trincot: stackoverflow.com/a/35391449/339440
Stephen R
Terima kasih untuk sarannya. Saya baru saja memperbarui jawabannya.
Dan
3

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.

Codemwnci
sumber
1

Ya, Anda harus menggunakan gema untuk menampilkan output. Mimetype: application / json

Nev Stokes
sumber
1

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.'"}';

jacr1614
sumber
1

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 .

Eyece
sumber
1

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;
?>
Bidyashish Kumar
sumber
Jenis media MIME untuk teks JSON adalah application / json
AA
0

Cara mudah untuk memformat objek domain Anda ke JSON adalah dengan menggunakan Marshal Serializer . Kemudian json_encodekirimkan 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/jsonsebagai 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);
Kingson
sumber
0

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:

masukkan deskripsi gambar di sini

Neeraj Singh
sumber
-1

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