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?

pna
sumber
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);
Filip Roséen - refp
sumber
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.

wrygiel.dll
sumber
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.

rdlowrey.dll
sumber
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))
snow6oy
sumber
6

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

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

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

$json = json_encode($json);

... sekarang JSON asli ...

Anuga
sumber
2

json_encode($array, JSON_FORCE_OBJECT)akan melakukannya juga. lihat https://www.php.net/manual/en/function.json-encode.php

Marc Steven Plotz
sumber
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"}
Fendi Setiawan
1

Anda juga bisa menggunakan

$var = ["key" => (object) array()];

json_encode($var);
rishabh parashar
sumber