Mengapa Anda mengonversi null menjadi objek JSON? Juga, bukankah hasil akhirnya adalah {}? Anda bisa melakukannya.
Ayman Safadi
1
(object) (array ()) mungkin? Solusi Anda terdengar bagus.
malletjo
1
json_encode()mengembalikan String, bukan objek. Kenapa melakukan ini? Apakah saya melewatkan sesuatu di sini?
Telmo Marques
2
sebenarnya "{}" keluar sebagai string! Saya menginginkan hasil seperti: {"some_property": {}} yang merupakan objek json kosong. Saya mengonversi null menjadi objek karena saya tidak tahu solusi lain untuk saat ini;)
pna
Saya suka solusi Anda 8]
Andrew
Jawaban:
117
Solusi Anda dapat berhasil ..
Dokumentasi menentukan yang (object) nullakan menghasilkan objek kosong, beberapa oleh karena itu mungkin mengatakan bahwa kode Anda valid dan itu adalah metode yang digunakan.
Jika nilai jenis lain apa pun diubah menjadi objek, instance baru dari kelas bawaan stdClass akan dibuat. Jika nilainya NULL, instance baru akan kosong.
.. tapi, cobalah untuk tetap aman!
Meskipun Anda tidak pernah tahu kapan / jika hal di atas akan berubah, jadi jika Anda ingin 100% yakin bahwa Anda akan selalu berakhir dengan {}data yang disandikan, Anda dapat menggunakan peretasan seperti:
json_encode (json_decode ("{}"));
Meskipun membosankan dan jelek saya berasumsi / berharap bahwa json_encode / json_decode kompatibel dengan satu dan lainnya dan selalu akan mengevaluasi yang berikut ini menjadi benar:
json_decode ("{}")akan mengembalikan stdClassper default, menggunakan di bawah ini harus dianggap aman. Padahal, seperti yang disebutkan, itu kurang lebih sama dengan melakukan (object) null.
Anda juga dapat memanipulasinya dengan mulus (seperti yang akan Anda lakukan dengan array asosiatif), dan itu akan terus merender dengan benar ke dalam kamus:
Jika Anda membutuhkan ini agar 100% kompatibel dengan kedua cara , Anda juga dapat membungkusnya json_decodesehingga mengembalikannya ArrayObjectssebagai ganti stdClassobjek (Anda harus berjalan di pohon hasil dan mengganti semua objek secara rekursif, yang merupakan tugas yang cukup mudah).
Gotchas . Hanya satu yang saya temukan sejauh ini: is_array(new ArrayObject())mengevaluasi ke false. Anda perlu menemukan dan mengganti is_arraykejadian dengan is_iterable.
Ini adalah jawaban yang paling benar di sini, ini melakukan apa yang dibutuhkan dalam kasus ini
Avi Kapuya
2
Terima kasih, ini adalah jawaban terbaik dan sangat sesuai dengan kebutuhan saya. Sebelum membaca ini, kode saya dimulai dengan jsonResponse = array()dan kemudian secara dinamis diisi oleh sebuah loop. Jika loop tidak memiliki iterasi tunggal, objek "kosong" (atau kamus, seperti Anda menyebutnya) dikodekan []sementara semua kasus lainnya dikodekan sebagai "{attr_1: value1, ...} . 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 = {}` dan tidak menggunakan json_encode sama sekali adalah sia-sia.
user2690527
Gotcha seharusnya tidak berlaku - karena ArrayObjectmengimplementasikan iterable, Anda dapat melakukan keduanya is_iterable($foo)serta menggunakan iterablepetunjuk tipe alih-alih array, yang tetap harus Anda lakukan untuk membiarkan diri Anda memiliki opsi untuk meneruskan contoh ArrayAccess, misalnya.
Moritz Friedrich
Keren! Memperbarui jawabannya.
wrygiel
17
Nah, json_encode()cukup kembalikan string dari array PHP / object / etc. Anda dapat mencapai efek yang sama jauh lebih efisien dengan melakukan:
$json = '{}';
Tidak ada gunanya menggunakan fungsi untuk mencapai ini.
PERBARUI
Sesuai pembaruan komentar Anda, Anda dapat mencoba:
tidak, itu adalah string dengan beberapa tanda kurung di dalamnya, saya ingin mendapatkan sesuatu seperti: {"some_properties": {}} ... BUKAN {"some_properties": "{}"} yang berbeda.
pna
Sial, menghabiskan terlalu banyak waktu untuk menulis postingan saya .. terlambat 8 menit haha!
Filip Roséen - refp
@refp Haha tangguh untuk bersaing dengan jawaban ensiklopedis :)
rdlowrey
hehe maaf rdlowrey tapi @refp sangat lengkap;)
pna
10
Untuk membuat objek kosong di JSON dengan PHP saya gunakan
Terima kasih ... Namun, perlu diingat bahwa solusi ini juga mengonversi larik yang tidak diindeks menjadi objek dengan pasangan nilai kunci. Misalnya: json_encode(['a', 'b'], JSON_FORCE_OBJECT)akan kembali{"0": "a", "1": "b"}
json_encode()
mengembalikan String, bukan objek. Kenapa melakukan ini? Apakah saya melewatkan sesuatu di sini?Jawaban:
Solusi Anda dapat berhasil ..
Dokumentasi menentukan yang
(object) null
akan menghasilkan objek kosong, beberapa oleh karena itu mungkin mengatakan bahwa kode Anda valid dan itu adalah metode yang digunakan... tapi, cobalah untuk tetap aman!
Meskipun Anda tidak pernah tahu kapan / jika hal di atas akan berubah, jadi jika Anda ingin 100% yakin bahwa Anda akan selalu berakhir dengan
{}
data yang disandikan, Anda dapat menggunakan peretasan seperti:json_encode (json_decode ("{}"));
Meskipun membosankan dan jelek saya berasumsi / berharap bahwa json_encode / json_decode kompatibel dengan satu dan lainnya dan selalu akan mengevaluasi yang berikut ini menjadi benar:
Metode yang direkomendasikan
json_decode ("{}")
akan mengembalikanstdClass
per default, menggunakan di bawah ini harus dianggap aman. Padahal, seperti yang disebutkan, itu kurang lebih sama dengan melakukan(object) null
.json_encode (new stdClass);
sumber
Jika Anda menggunakan objek sebagai kamus dinamis (dan saya rasa Anda melakukannya), maka saya pikir Anda ingin menggunakan ArrayObject .
Itu memetakan ke kamus JSON bahkan saat kosong. Sangat bagus jika Anda perlu membedakan antara daftar (array) dan kamus (array asosiatif):
$complex = array('list' => array(), 'dict' => new ArrayObject()); print json_encode($complex); // -> {"list":[],"dict":{}}
Anda juga dapat memanipulasinya dengan mulus (seperti yang akan Anda lakukan dengan array asosiatif), dan itu akan terus merender dengan benar ke dalam kamus:
$complex['dict']['a'] = 123; print json_encode($complex); // -> {"list":[],"dict":{"a":123}} unset($complex['dict']['a']); print json_encode($complex); // -> {"list":[],"dict":{}}
Jika Anda membutuhkan ini agar 100% kompatibel dengan kedua cara , Anda juga dapat membungkusnya
json_decode
sehingga mengembalikannyaArrayObjects
sebagai gantistdClass
objek (Anda harus berjalan di pohon hasil dan mengganti semua objek secara rekursif, yang merupakan tugas yang cukup mudah).Gotchas . Hanya satu yang saya temukan sejauh ini:
is_array(new ArrayObject())
mengevaluasi kefalse
. Anda perlu menemukan dan menggantiis_array
kejadian denganis_iterable
.sumber
jsonResponse = array()
dan kemudian secara dinamis diisi oleh sebuah loop. Jika loop tidak memiliki iterasi tunggal, objek "kosong" (atau kamus, seperti Anda menyebutnya) dikodekan[]
sementara semua kasus lainnya dikodekan sebagai "{attr_1: value1, ...}. 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 = {}` dan tidak menggunakan json_encode sama sekali adalah sia-sia.ArrayObject
mengimplementasikaniterable
, Anda dapat melakukan keduanyais_iterable($foo)
serta menggunakaniterable
petunjuk tipe alih-aliharray
, yang tetap harus Anda lakukan untuk membiarkan diri Anda memiliki opsi untuk meneruskan contohArrayAccess
, misalnya.Nah,
json_encode()
cukup kembalikan string dari array PHP / object / etc. Anda dapat mencapai efek yang sama jauh lebih efisien dengan melakukan:$json = '{}';
Tidak ada gunanya menggunakan fungsi untuk mencapai ini.
PERBARUI Sesuai pembaruan komentar Anda, Anda dapat mencoba:
$test = json_encode(array('some_properties'=>new stdClass));
Meskipun saya tidak yakin itu lebih baik dari apa yang selama ini Anda lakukan.
sumber
Untuk membuat objek kosong di JSON dengan PHP saya gunakan
$json=json_decode('{}'); $json->status=202; $json->message='Accepted'; print_r($json);
yang diproduksi
stdClass Object ( [status] => 202 [message] => Accepted )
yang perlu, karena nanti saya harus melakukan ini
if(is_object($json))
sumber
Saya selalu melakukan
(Object)[];
, seperti:$json = (Object)[]; // [] could also be array()
... bermain-main dengannya di PHP ...
... sekarang JSON asli ...
sumber
json_encode($array, JSON_FORCE_OBJECT)
akan melakukannya juga. lihat https://www.php.net/manual/en/function.json-encode.phpsumber
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
akan kembali{"0": "a", "1": "b"}
Anda juga bisa menggunakan
$var = ["key" => (object) array()]; json_encode($var);
sumber