Menu

PHP json_encode(): Dizileri ve Nesneleri JSON'a Çevirme

json_encode($value) bir PHP dizisini, nesnesini veya skaler değerini bir JSON dizgesine çevirir. İlişkisel diziler JSON nesnesi, listeler JSON dizisi olur ve JSON_PRETTY_PRINT ile JSON_UNESCAPED_UNICODE gibi bayraklar çıktıyı kontrol eder.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

json_encode($value) bir PHP değeri için JSON metnini döndürür. İlişkisel bir dizi bir JSON nesnesi, bir liste (0, 1, 2... anahtarları) bir JSON dizisi olur; dizgeler, sayılar, true, false ve null ise JSON karşılıklarına dönüşür.

Çıktı:

{"name":"Ada","age":36,"langs":["php","js"],"admin":true,"manager":null}
string

Sonuç düz bir dizgedir; bir tarayıcıya gönderilmeye, bir dosyada veya veritabanı sütununda saklanmaya ya da başka bir programa verilmeye hazırdır. JSON'u geri PHP'ye çevirmek için json_decode() kullanın.

JSON'u okunur biçimde yazdırma

json_encode() ikinci argüman olarak bayraklar alır. JSON_PRETTY_PRINT satır sonları ve 4 boşluklu girinti ekler; bir yapılandırma dosyasında veya hata ayıklama logunda istediğiniz budur. Birkaç bayrağı | ile birleştirin:

Çıktı:

{
    "app": "shop",
    "debug": false,
    "db": {
        "host": "localhost",
        "port": 3306
    },
    "tags": []
}

Japonca ve diğer UTF-8 metinleri okunur tutma

Varsayılan olarak json_encode() ASCII olmayan her karakteri bir \u kaçışı olarak yazar ve her / işaretinin önüne bir ters eğik çizgi koyar. İkisi de geçerli JSON'dur ve aynı metne geri çözülür, ama çıktıyı okunması zor ve daha uzun yapar. JSON_UNESCAPED_UNICODE karakterleri korur, JSON_UNESCAPED_SLASHES ise URL'leri olduğu gibi tutar:

Çıktı:

{"name":"\u308a\u3093\u3054","price":120,"url":"https:\/\/example.com\/fruit\/apple"}
{"name":"りんご","price":120,"url":"https://example.com/fruit/apple"}

Japonca veya Türkçe metin çözümlemeden sonra bozuk görünüyorsa sorun kaçışlar değildir: dizge baştan UTF-8 değildi. json_encode() yalnızca UTF-8 kabul eder ve hatalar bölümünde gösterildiği gibi diğer her şey için false döndürür.

Bir dizi liste yerine nesneye dönüştüğünde

Bir PHP dizisi yalnızca anahtarları tam olarak sırasıyla 0, 1, 2... olduğunda bir JSON dizisi olarak kodlanır. Başka herhangi bir anahtar onu bir JSON nesnesi yapar. Bu, anahtarlarda boşluk bırakan unset() veya array_filter() sonrasında insanları şaşırtır:

Çıktı:

{"0":"apple","2":"cherry"}
["apple","cherry"]
{"1":"a","2":"b"}
[]
{}
{"0":"a","1":"b"}

Alıcı kod bir liste beklediğinde kodlamadan önce array_values() çağırın. Boş olabilecek bir nesne bekliyorsa new stdClass() veya (object) $array kullanın, böylece boş bir değer yine {} olarak çıkar.

Bir nesneyi kodlama ve JSON'unu JsonSerializable ile kontrol etme

Düz bir nesne yalnızca public özellikleriyle kodlanır; protected ve private olanlar atlanır. Bir nesnenin JSON'da tam olarak nasıl görüneceğine karar vermek için JsonSerializable arayüzünü uygulayın ve veriyi jsonSerialize() metodundan döndürün:

Çıktı:

{"name":"Ada","nick":null}
{"date":"2026-03-14 09:30:00.000000","timezone_type":3,"timezone":"UTC"}
{
    "id": 7,
    "total": 19.5,
    "created": "2026-03-14T09:30:00+00:00"
}

enum Status: string gibi değerli bir enum değeri ("active") olarak kodlanır. Saf bir enum'un değeri yoktur, bu yüzden json_encode() onda "Non-backed enums have no default serialization" ile başarısız olur.

Sayılar, ondalıklı sayılar ve sayısal dizgeler

Tam sayılar ve ondalıklı sayılar JSON sayıları olarak yazılır ve dizgeler rakam içerseler bile dizge olarak kalır. Üç bayrak bunu değiştirir:

Çıktı:

{"price":10}
{"price":10.0}
0.30000000000000004
{"qty":"3","id":"007"}
{"qty":3,"id":7}

JSON_NUMERIC_CHECK her sayısal dizgeyi dönüştürür, bu yüzden "007" gibi bir ID veya "01234" gibi bir posta kodu baştaki sıfırlarını kaybeder. Onu bütün bir dizi üzerinde kullanmak yerine kastettiğiniz alanları (int) ile dönüştürün.

json_encode false döndürüyor: hatayı bulma

json_encode() değeri kodlayamadığında false döndürür. Olağan nedenler geçerli UTF-8 olmayan bir dizge (eski bir dosyadan veya Latin-1 bir veritabanından okunan metin) ve NAN ile INF ondalık değerleridir. json_last_error_msg() neyin yanlış gittiğini söyler; JSON_THROW_ON_ERROR ise bunun yerine bir JsonException fırlatmasını sağlar:

Çıktı:

bool(false)
Malformed UTF-8 characters, possibly incorrectly encoded
{"name":"Caf\ufffd"}
{"name":"Café"}
JsonException: Inf and NaN cannot be JSON encoded

Yeni kodda JSON_THROW_ON_ERROR daha iyi bir varsayılandır: kimsenin kontrol etmediği bir false sonunda boş bir dizge olarak saklanır veya gönderilir.

Bir PHP API'sinden JSON döndürme

JSON ile yanıt veren bir PHP betiği herhangi bir şey yazdırmadan önce Content-Type başlığını ayarlar, bir kez kodlar ve durur:

<?php
header('Content-Type: application/json; charset=utf-8');

$products = [
    ['id' => 1, 'name' => 'りんご', 'price' => 120],
    ['id' => 2, 'name' => 'みかん', 'price' => 80],
];

echo json_encode(['data' => $products], JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
exit;

Bunun yerine JSON'u bir HTML <script> etiketinin içine yazdırdığınızda JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT ekleyin. Varsayılan eğik çizgi kaçışı </script> ifadesini <\/script> yapar, ama biri JSON_UNESCAPED_SLASHES eklediği anda bu koruma kaybolur ve bir değerdeki <!-- yine tarayıcının betiği ayrıştırma şeklini değiştirir. Bayraklar <, >, &, ' ve " karakterlerini \u003C, \u003E, \u0026, \u0027 ve \u0022 olarak yazar; JavaScript onları aynı karakterler olarak geri okur.

Sıkça Sorulan Sorular

PHP'de bir diziyi JSON'a nasıl çeviririm?

Onu json_encode() fonksiyonuna verin: json_encode(['name' => 'Ada', 'age' => 36]) {"name":"Ada","age":36} döndürür. Anahtarları sırasıyla 0, 1, 2... olan bir dizi bunun yerine bir JSON dizisi olur: json_encode(['a', 'b']) ["a","b"] döndürür.

PHP'de JSON'u nasıl okunur biçimde yazdırırım?

JSON_PRETTY_PRINT bayrağını ekleyin: json_encode($data, JSON_PRETTY_PRINT) 4 boşlukla girinti yapar ve her değeri kendi satırına koyar. Bayrakları | ile birleştirin, örneğin JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE.

json_encode Japonca metni neden \u kodlarına çeviriyor?

Varsayılan olarak ASCII olmayan her karakter bir \uXXXX kaçışı olarak yazılır, bu yüzden りんご \u308a\u3093\u3054 olur. Yine geçerli JSON'dur, ama karakterleri okunur tutmak için JSON_UNESCAPED_UNICODE verin.

json_encode neden false döndürüyor?

Genellikle bir dizge geçerli UTF-8 olmadığı için ya da veri NAN veya INF içerdiği için. Nedeni görmek için json_last_error_msg() çağırın ya da false döndürmek yerine bir JsonException fırlatması için JSON_THROW_ON_ERROR verin.

json_encode boş bir dizi için [] yerine {} çıktısını nasıl verir?

Boş bir PHP dizisi her zaman [] olarak kodlanır. Boş bir nesne için new stdClass() veya (object) [] kullanın ya da değerdeki her diziyi nesneye çeviren JSON_FORCE_OBJECT bayrağını kullanın.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA