Cara terbaik untuk membuat objek kosong di JSON dengan PHP?


96

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?


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.

PHP: Objek - Manual

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:

$a = <something>;

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

Metode yang direkomendasikan

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.

json_encode (new stdClass);

1
setelah menggunakan "new ArrayObject ()" atau "(object) null" saya mendapatkan => "Object" dan bukan '{}' sebagai respon. menggunakan php 5.6.29.
rohitmb

84

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_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.


5
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:

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

Meskipun saya tidak yakin itu lebih baik dari apa yang selama ini Anda lakukan.


1
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

$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))

6

Saya selalu melakukan (Object)[];, seperti:

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

... bermain-main dengannya di PHP ...

$json = json_encode($json);

... sekarang JSON asli ...



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.