PHP Komut Dosyasından JSON Döndürme


877

Bir PHP komut dosyasından JSON dönmek istiyorum.

Sonucu yankılanıyor muyum? Content-TypeÜstbilgiyi ayarlamam gerekir mi?

Yanıtlar:


1603

Genellikle onsuz iyiyseniz, İçerik Türü başlığını ayarlayabilirsiniz ve ayarlamanız gerekir:

<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);

Belirli bir çerçeve kullanmıyorsam, genellikle çıkış davranışını değiştirmek için bazı istek parametrelerine izin veririm. Genellikle hızlı sorun giderme için bir başlık göndermemek veya bazen veri yükünü göz küresine yazdırmak yararlı olabilir (çoğu durumda gerekli olmamalıdır).


9
Her ihtimale karşı: header () komutlarını, "header already sent" uyarılarından kaçınmak için yalnızca çıkış arabelleğe ek olarak kullanmalısınız
Kevin

6
Php dosyası BOM olmadan UTF-8 kodlanmalıdır :)
Krzysztof Kalinowski

217
header('Content-type:application/json;charset=utf-8');
Timo Huovinen

14
@mikepote Aslında PHP dosyasının üstünde header komutuna sahip olmanın gerekli olduğunu düşünmüyorum. Yanlışlıkla bir şeyler tükürüyorsanız ve bu başlık komutunuzu çalıştırıyorsa, kodunuzu çözmeniz yeterlidir, çünkü bozuk.
Halfstop

8
@KrzysztofKalinowski hayır, PHP dosyasının UTF-8 kodlu olması gerekmez. çıkış UTF-8 kodlu OLMALIDIR. Bu yanlış ifadeler, deneyimli olmayan kullanıcıların şeylerin kırılmasını nasıl önleyeceklerini öğrenmelerine yardımcı olmaz, ancak onlara ilişkin mitleri büyütmeye ve kodlamaların akışlarda hangi rolü oynadığını ve nasıl çalıştığını asla öğrenmemeye yardımcı olur.
Áxel Costas Pena

124

JSON döndüren eksiksiz ve güzel bir PHP kodu:

$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

Yöntemin üzerindeki kılavuzajson_encode göre bir dize olmayan ( yanlış ) döndürebilirsiniz :

Başarılı veya başarısız olduğunda JSON kodlu bir dize döndürür FALSE.

Bu durumda echo json_encode($data), geçersiz JSON olan boş dizeyi çıktılar .

json_encodefalseargümanı UTF-8 olmayan bir dize içeriyorsa , örneğin başarısız olur (ve geri döner ).

Bu hata koşulu PHP'de yakalanmalıdır, örneğin:

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

Daha sonra, alıcı uç elbette, jsonError özelliğinin varlığının, buna göre işlem görmesi gereken bir hata koşulunu gösterdiğini bilmelidir.

Üretim modunda, istemciye yalnızca genel bir hata durumu göndermek ve daha sonra incelenmek üzere daha spesifik hata mesajlarını kaydetmek daha iyi olabilir.

PHP'nin Dokümantasyonundaki JSON hatalarıyla başa çıkma hakkında daha fazla bilgi edinin .


2
charsetJSON için parametre yok ; sonunda nota bakın tools.ietf.org/html/rfc8259#section-11 : "Hayır 'charset' parametresi bu kayıt için tanımlanan bir ekleme gerçekten uyumlu alıcılara üzerinde hiçbir etkisi yoktur.". (JSON, araçlar başına UTF-8 olarak iletilmelidir.ietf.org/html/rfc8259#section-8.1 , bu yüzden UTF-8 olarak kodlandığını belirtmek biraz gereksizdir.)
Patrick Dark

1
Bunu vurguladığınız için teşekkürler, @PatrickDark. Yedek charsetbaşlık HTTP başlık dizesinden kaldırıldı.
trincot

38

Verileri kodlamak ve içerik türünü ayarlamak için json_encode'u deneyin header('Content-type: application/json');.


15

İçerik türünü ile ayarlayın header('Content-type: application/json');ve ardından verilerinizi yankılayın.


12

Erişim güvenliğini ayarlamak da iyidir - sadece * ulaşmak istediğiniz alan adıyla değiştirin.

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

İşte bununla ilgili daha fazla örnek: Access-Control-Allow-Origin nasıl atlanır?


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

Üstbilgideki karakter kümesini belirten fark nedir? Lütfen açıkla, teşekkürler.
Sanxofon

6

Yukarıda belirtildiği gibi:

header('Content-Type: application/json');

işi yapacak. ancak şunu unutmayın:

  • Ajax, bu üstbilgi kullanılmasa bile json'u okumakta zorlanmayacaktır, json'unuzda bazı HTML etiketleri varsa. Bu durumda üstbilgiyi application / json olarak ayarlamanız gerekir.

  • Dosyanızın UTF8-BOM'da kodlanmadığından emin olun. Bu biçim dosyanın üstüne bir karakter ekler, böylece header () çağrınız başarısız olur.


4

Basit bir fonksiyon döndürmek için JSON yanıtını ile HTTP durum kodu .

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_removeve açıkça http yanıtını ayarlamak iyi bir fikirdir; durum ve ardından http_response ayarı gereksiz görünse de. Ayrıca exitsonuna bir ifade eklemek isteyebilir . İşlevinizi @trincot ile birleştirdim: stackoverflow.com/a/35391449/339440
Stephen R

Önerin için teşekkürler. Cevabı yeni güncelledim.
Dan

3

Sorunuzun cevabı burada ,

Diyor ki.

JSON metni için MIME ortam türü application / json şeklindedir.

bu nedenle üstbilgiyi bu türe ayarlar ve JSON dizenizin çıktısını alırsanız çalışması gerekir.


1

Evet, çıktıyı görüntülemek için echo kullanmanız gerekecek. Mimetype: uygulama / json


1

Eğer php özel bilgi gönderme json almak gerekiyorsa header('Content-Type: application/json');başka bir şey yazdırmak için önce ekleyebilirsiniz , böylece o zaman size custome yazdırabilirsinizecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';


1

Bir veritabanını sorgularsanız ve sonuç JSON biçiminde ayarlanırsa, şu şekilde yapılabilir:

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

?>

JQuery kullanarak sonucu ayrıştırma konusunda yardım için bu eğiticiye bir göz atın .


1

Bu json.php komut dosyası olarak adlandırılan json değeri herhangi bir rastgele değer olacağı için erkek kadın ve kullanıcı kimliği döndürmek için basit bir PHP betiğidir.

Umarım bu yardım teşekkürler

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

JSON metni için MIME ortam türü application / json
AA olduğunu

0

Etki alanı nesnelerinizi JSON olarak biçimlendirmenin kolay bir yolu, Marshal Serializer'ı kullanmaktır . Ardından verileri json_encodeiletin ve ihtiyaçlarınıza uygun İçerik Türü başlığını gönderin. Symfony gibi bir çerçeve kullanıyorsanız, başlıkları manuel olarak ayarlamanıza gerek yoktur. Orada JsonResponse'yi kullanabilirsiniz .

Örneğin, Javascript ile ilgilenmek için doğru İçerik Türü olacaktır application/javascript.

Ya da bazı oldukça eski tarayıcıları desteklemeniz gerekiyorsa en güvenli olanı olacaktır text/javascript.

Mobil uygulama gibi diğer tüm amaçlar application/jsoniçin İçerik Türü olarak kullanın .

İşte küçük bir örnek:

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

API için JSON yanıtı döndürmeye çalıştığınızda veya başka uygun başlıklara sahip olduğunuzdan ve geçerli bir JSON verisi döndürdüğünüzden emin olun.

PHP dizisinden veya JSON dosyasından JSON yanıtını döndürmenize yardımcı olan örnek komut dosyası.

PHP Komut Dosyası (Kod):

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

JSON Dosyası (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:

resim açıklamasını buraya girin


-1

Bu küçük PHP kütüphanesini kullanabilirsiniz . Üstbilgileri gönderir ve kolayca kullanmanız için bir nesne verir.

Şöyle görünüyor:

<?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();
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.