Mengembalikan JSON dari Skrip PHP


877

Saya ingin mengembalikan JSON dari skrip PHP.

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

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


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

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 .


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


15

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


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?


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

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.


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

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.


1

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


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


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 .


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

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

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


-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();
?>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.