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ı?
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ı?
json_encode()
bir nesne değil, bir String döndürür. Bunu neden yapıyorsun? Burada bir şey mi kaçırıyorum?
Yanıtlar:
Belgeler bunun (object) null
boş 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.
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.
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));
json_decode ("{}")
stdClass
varsayı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);
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
, stdClass
nesneler 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_array
Olayları ile bulmanız ve değiştirmeniz gerekir is_iterable
.
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.
ArrayObject
uygularken iterable
, her ikisini is_iterable($foo)
de yapabilir ve iterable
bunun 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
.
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.
json_encode($array, JSON_FORCE_OBJECT)
bunu da yapacak. bkz. https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
dönecekti{"0": "a", "1": "b"}
Ayrıca kullanabilirsin
$var = ["key" => (object) array()];
json_encode($var);