Untuk membuat objek JSON kosong saya biasanya menggunakan:
json_encode((object) null);
mentransmisikan null ke suatu objek berfungsi, tetapi apakah ada cara lain yang lebih disukai dan / atau masalah dengan solusi ini?
Untuk membuat objek JSON kosong saya biasanya menggunakan:
json_encode((object) null);
mentransmisikan null ke suatu objek berfungsi, tetapi apakah ada cara lain yang lebih disukai dan / atau masalah dengan solusi ini?
json_encode()
mengembalikan String, bukan objek. Kenapa melakukan ini? Apakah saya melewatkan sesuatu di sini?
Jawaban:
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.
Jika nilai jenis lain apa pun diubah menjadi objek, instance baru dari kelas bawaan stdClass akan dibuat. Jika nilainya NULL, instance baru akan kosong.
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:
$a = <something>;
$a === json_decode (json_encode ($a));
json_decode ("{}")
akan mengembalikan stdClass
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);
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 mengembalikannya ArrayObjects
sebagai ganti stdClass
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 ke false
. Anda perlu menemukan dan mengganti is_array
kejadian dengan is_iterable
.
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
mengimplementasikan iterable
, Anda dapat melakukan keduanya is_iterable($foo)
serta menggunakan iterable
petunjuk tipe alih-alih array
, yang tetap harus Anda lakukan untuk membiarkan diri Anda memiliki opsi untuk meneruskan contoh ArrayAccess
, 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.
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))
json_encode($array, JSON_FORCE_OBJECT)
akan melakukannya juga. lihat https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
akan kembali{"0": "a", "1": "b"}
Anda juga bisa menggunakan
$var = ["key" => (object) array()];
json_encode($var);