PHP ile JSON'da boş bir nesne oluşturmanın en iyi yolu?


96

Boş bir JSON nesnesi oluşturmak için genellikle kullanıyorum:

json_encode((object) null);

bir nesneye boş değer atamak işe yarıyor, ancak bu çözümle ilgili tercih edilen başka bir yol ve / veya herhangi bir sorun var mı?


Neden null değerini JSON nesnesine dönüştürüyorsunuz? Ayrıca, sonuç {} olmaz mı? Bunu yapabilirsin.
Ayman Safadi

1
(nesne) (dizi ()) belki? Çözümünüz kulağa hoş geliyor.
malletjo

1
json_encode()bir nesne değil, bir String döndürür. Bunu neden yapıyorsun? Burada bir şey mi kaçırıyorum?
Telmo Marques

2
aslında "{}" bir dizge olarak çıkıyor! Şunun gibi bir sonuç istiyorum: {"some_property": {}} boş bir json nesnesi. Bir boş değeri nesneye dönüştürüyorum çünkü şimdilik başka bir çözüm bilmiyorum;)
pna

Çözümünüzü beğendim 8]
Andrew

Yanıtlar:


118

Çözümünüz işe yarayabilir ..

Belgeler bunun (object) nullboş bir nesne ile sonuçlanacağını belirtir, bu nedenle bazıları kodunuzun geçerli olduğunu ve kullanılacak yöntem olduğunu söyleyebilir.

PHP: Nesneler - Manuel

Başka türden bir değer bir nesneye dönüştürülürse, yerleşik stdClass sınıfının yeni bir örneği oluşturulur. Değer NULL ise, yeni örnek boş olacaktır.


.. ama, onu güvende tutmaya çalışın!

Yukarıdakilerin ne zaman / değişip değişmeyeceğini asla bilemezsiniz, bu nedenle {}kodlanmış verilerinizde her zaman bir sonuçla karşılaşacağınızdan % 100 emin olmak isterseniz, aşağıdaki gibi bir hack kullanabilirsiniz:

json_encode (json_decode ("{}"));

Sıkıcı ve çirkin olsa da json_encode / json_decode'un bir ve diğeriyle uyumlu olduğunu varsayıyorum / umuyorum ve her zaman aşağıdakileri doğru olarak değerlendirecektir:

$a = <something>;

$a === json_decode (json_encode ($a)); 

Önerilen yöntem

json_decode ("{}")stdClassvarsayılan olarak bir döndürür , bu nedenle aşağıdakileri kullanarak güvenli kabul edilir. Yine de belirtildiği gibi, yapmakla hemen hemen aynı şey (object) null.

json_encode (new stdClass);

1
"new ArrayObject ()" veya "(object) null" kullanıldıktan sonra, yanıt olarak '{}' değil => "Object" alıyorum. php 5.6.29 kullanarak.
rohitmb

84

Nesneleri dinamik sözlükler olarak kullanırsanız (ve sanırım kullanıyorsunuz), o zaman bir ArrayObject kullanmak istediğinizi düşünüyorum .

Boş olsa bile JSON sözlüğüyle eşleşir. Listeler (diziler) ve sözlükler (ilişkilendirilebilir diziler) arasında ayrım yapmanız gerekiyorsa harikadır:

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

Ayrıca onu sorunsuz bir şekilde de işleyebilirsiniz (ilişkilendirilebilir bir dizide yapacağınız gibi) ve bir sözlüğe düzgün şekilde dönüştürmeye devam eder:

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

Bunun her iki şekilde de % 100 uyumlujson_decode olması gerekiyorsa ArrayObjects, stdClassnesneler yerine geri dönmesi için de sarabilirsiniz ( hedef ağacında yürümeniz ve tüm nesneleri yinelemeli olarak değiştirmeniz gerekir ki bu oldukça kolay bir iştir).

Gotchas . Şimdiye kadar bulduğum tek bir tane: is_array(new ArrayObject())değerlendiriyor false. is_arrayOlayları ile bulmanız ve değiştirmeniz gerekir is_iterable.


5
Buradaki en doğru cevap bu, bu durumda tam olarak gerekli olanı yapıyor
Avi Kapuya

2
Teşekkürler, bu en iyi cevap ve ihtiyaçlarıma tam olarak uyuyor. Bunu okumadan önce kodum ile başladı jsonResponse = array()ve sonra dinamik bir döngü ile dolduruldu. Döngünün tek bir yinelemesi yoksa, "boş" nesne (veya sizin []deyiminizle sözlük), diğer tüm durumlar "{attr_1: değer1, ...} . All the other answers around here have a flaw. They assume that one already knows if the dictionary is empty or not in advance. Especially the answer that tells one should simply write $ json = {}" olarak kodlanırken kodlanır ve json_encode kullanmamak boşunadır.
user2690527

Gotcha geçerli olmamalıdır - ArrayObjectuygularken iterable, her ikisini is_iterable($foo)de yapabilir ve iterablebunun yerine tür ipucunu kullanabilirsiniz; arrayörneğin, kendinize örneklerini geçme seçeneğini bırakmak için yine de yapmalısınız ArrayAccess.
Moritz Friedrich

Güzel! Cevap güncellendi.
wrygiel

17

Eh, json_encode()basitçe vb bir PHP dizi / nesne / Bir dize döndürür. Şunları yaparak aynı etkiyi çok daha verimli bir şekilde elde edebilirsiniz:

$json = '{}';

Bunu başarmak için bir işlev kullanmanın gerçekten bir anlamı yok.

GÜNCELLEME Yorum güncellemelerinize göre şunları deneyebilirsiniz:

$test = json_encode(array('some_properties'=>new stdClass));

Yaptığından daha iyi olmadığından emin değilim.


1
hayır, bu içinde bazı parantezler olan bir dizedir, şöyle bir şey elde etmek istiyorum: {"bazı_özellikler": {}} ... DEĞİL {"bazı_özellikler": "{}"} farklıdır.
pna

Kahretsin, yazımı yazmak için çok zaman harcadım .. 8 dakika çok geç haha!
Filip Roséen - refp

@refp Haha ansiklopedik cevapla rekabet etmek zor :)
rdlowrey

hehe üzgünüm rdlowrey ama @refp çok kapsamlıydı;)
pna

10

JSON'da PHP ile boş bir nesne oluşturmak için

$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);

hangi üretti

stdClass Object
(
    [status] => 202
    [message] => Accepted
)

bu gerekli, çünkü daha sonra bunu yapmak zorundayım

if(is_object($json))

6

Ben her zaman şöyle yaparım (Object)[];:

$json = (Object)[]; // [] could also be array()

... PHP ile oynayın ...

$json = json_encode($json);

... şimdi gerçek JSON ...



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.