วิธีที่ดีที่สุดในการสร้างวัตถุว่างใน JSON ด้วย PHP?


96

ในการสร้างออบเจ็กต์ JSON ว่างฉันมักจะใช้:

json_encode((object) null);

การแคสต์โมฆะให้กับออบเจ็กต์ใช้งานได้ แต่มีวิธีอื่นที่ดีกว่าและ / หรือปัญหาใด ๆ กับโซลูชันนี้หรือไม่?


ทำไมคุณถึงแปลง null เป็นวัตถุ JSON นอกจากนี้ผลลัพธ์สุดท้ายจะไม่เป็น {} หรือ คุณก็ทำได้
Ayman Safadi

1
(object) (array ()) อาจจะ? วิธีแก้ปัญหาของคุณฟังดูดี
malletjo

1
json_encode()ส่งคืนสตริงไม่ใช่วัตถุ ทำแบบนี้ทำไม? ฉันขาดอะไรที่นี่?
Telmo Marques

2
จริงๆแล้ว "{}" ออกมาเป็นสตริง! ฉันต้องการผลลัพธ์เช่น: {"some_property": {}} ที่เป็นวัตถุ json ว่างเปล่า ฉันแปลง null เป็น object เพราะฉันไม่รู้วิธีแก้ปัญหาใด ๆ ในตอนนี้;)
pna

ฉันชอบวิธีแก้ปัญหาของคุณ 8]
Andrew

คำตอบ:


117

วิธีแก้ปัญหาของคุณได้ผล ..

เอกสารระบุว่า(object) nullจะส่งผลให้วัตถุว่างเปล่าบางคนอาจบอกว่ารหัสของคุณถูกต้องและเป็นวิธีการที่จะใช้

PHP: Objects - คู่มือ

ถ้าค่าของชนิดอื่นถูกแปลงเป็นอ็อบเจ็กต์อินสแตนซ์ใหม่ของคลาสในตัว stdClass จะถูกสร้างขึ้น หากค่าเป็น NULL อินสแตนซ์ใหม่จะว่างเปล่า


.. แต่พยายามรักษาให้ปลอดภัย!

แม้ว่าคุณจะไม่มีทางรู้ว่าจะมีการเปลี่ยนแปลงเมื่อใด / หากข้างต้นดังนั้นหากคุณต้องการความมั่นใจ 100% ว่าคุณจะพบ{}ข้อมูลที่เข้ารหัสอยู่เสมอคุณสามารถใช้แฮ็คได้เช่น:

json_encode (json_decode ("{}"));

แม้ว่ามันจะน่าเบื่อและน่าเกลียดฉันก็ถือว่า / หวังว่า json_encode / json_decode จะเข้ากันได้กับอันอื่นและจะประเมินสิ่งต่อไปนี้เป็นจริงเสมอ:

$a = <something>;

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

วิธีที่แนะนำ

json_decode ("{}")จะคืนstdClassค่าตามค่าเริ่มต้นโดยใช้ด้านล่างนี้เพื่อให้ถือว่าปลอดภัย (object) nullแม้ว่าจะเป็นที่กล่าวถึงก็สวยมากสิ่งเดียวกับการทำ

json_encode (new stdClass);

1
หลังจากใช้ "New ArrayObject ()" หรือ "(object) null" ฉันได้รับ => "Object" และไม่ใช่ "{}" เป็นคำตอบ ใช้ php 5.6.29
rohitmb

84

ถ้าคุณใช้เป็นวัตถุพจนานุกรมแบบไดนามิก (และผมคิดว่าคุณทำ) แล้วฉันคิดว่าคุณต้องการใช้ArrayObject

แมปลงในพจนานุกรม JSON แม้ว่าจะว่างเปล่าก็ตาม จะดีมากหากคุณต้องการแยกความแตกต่างระหว่างรายการ (อาร์เรย์) และพจนานุกรม (อาร์เรย์ที่เชื่อมโยง):

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

คุณยังสามารถจัดการมันได้อย่างราบรื่น (เช่นเดียวกับที่คุณทำกับอาร์เรย์ที่เชื่อมโยงกัน) และจะแสดงผลอย่างถูกต้องในพจนานุกรม:

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

หากคุณต้องการให้สิ่งนี้เข้ากันได้ 100% ทั้งสองวิธีคุณยังสามารถห่อjson_decodeเพื่อให้ส่งคืนArrayObjectsแทนstdClassวัตถุได้ (คุณจะต้องเดินตามแผนผังผลลัพธ์และแทนที่วัตถุทั้งหมดแบบวนซ้ำซึ่งเป็นงานที่ค่อนข้างง่าย)

gotchas เพียงคนเดียวที่ฉันได้พบจนถึงขณะนี้: ประเมินis_array(new ArrayObject()) falseคุณจำเป็นต้องค้นหาและแทนที่เกิดขึ้นกับis_arrayis_iterable


5
นี่คือคำตอบที่ถูกต้องที่สุดที่นี่มันเป็นสิ่งที่จำเป็นในกรณีนี้
Avi Kapuya

2
ขอบคุณนี่คือคำตอบที่ดีที่สุดและตรงกับความต้องการของฉัน ก่อนที่จะอ่านสิ่งนี้รหัสของฉันเริ่มต้นด้วยjsonResponse = array()จากนั้นก็เติมแบบไดนามิกโดยการวนซ้ำ หากลูปไม่มีการวนซ้ำเพียงครั้งเดียวอ็อบเจ็กต์ "ว่าง" (หรือพจนานุกรมตามที่คุณเรียก) จะถูกเข้ารหัสใน[]ขณะที่กรณีอื่น ๆ ทั้งหมดถูกเข้ารหัสเป็น "{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 = {}` และ ไม่ใช้ json_encode เลยก็ไร้ผล
user2690527

ไม่ควรใช้ gotcha - เนื่องจากArrayObjectการใช้งานiterableคุณสามารถทำได้ทั้งสองis_iterable($foo)อย่างและใช้iterableคำใบ้ประเภทแทนarrayซึ่งคุณควรทำต่อไปเพื่อปล่อยให้ตัวเองมีตัวเลือกในการส่งผ่านอินสแตนซ์ArrayAccessเช่น
Moritz Friedrich

เย็น! อัปเดตคำตอบ
wrygiel

17

ดีjson_encode()ก็กลับสตริงจากอาร์เรย์ PHP / วัตถุ / ฯลฯ คุณสามารถบรรลุเอฟเฟกต์เดียวกันได้อย่างมีประสิทธิภาพมากขึ้นโดยทำ:

$json = '{}';

ไม่มีประโยชน์อะไรเลยในการใช้ฟังก์ชันเพื่อทำสิ่งนี้ให้สำเร็จ

UPDATE เป็นต่อการปรับปรุงความคิดเห็นของคุณคุณอาจลอง:

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

แม้ว่าฉันไม่แน่ใจว่าจะดีไปกว่าสิ่งที่คุณทำอยู่ก็ตาม


1
ไม่ใช่นั่นคือสตริงที่มีวงเล็บอยู่ข้างในฉันต้องการบรรลุบางอย่างเช่น: {"some_properties": {}} ... ไม่ใช่ {"some_properties": "{}"} ที่ต่างออกไป
pna

โอ้ยยยใช้เวลาเขียนโพสต์นานเกินไป .. 8 นาทีสายเกินไปฮ่า ๆ !
Filip Roséen - อ้างอิง

@refp ฮ่าฮ่ายากที่จะแข่งขันกับคำตอบสารานุกรม :)
rdlowrey

เฮ้ขอโทษ rdlowrey แต่ @refp หมดแรงมาก;)
pna

10

ในการสร้างวัตถุว่างใน JSON ด้วย PHP ฉันใช้

$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);

ซึ่งผลิต

stdClass Object
(
    [status] => 202
    [message] => Accepted
)

ซึ่งเป็นสิ่งที่จำเป็นเพราะในภายหลังฉันต้องทำสิ่งนี้

if(is_object($json))

6

ฉันมักจะทำ(Object)[];เช่น:

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

... เล่นกับมันใน PHP ...

$json = json_encode($json);

... ตอนนี้เป็น JSON จริง ...


2

json_encode($array, JSON_FORCE_OBJECT)ก็จะทำเช่นกัน ดูhttps://www.php.net/manual/en/function.json-encode.php


ขอบคุณ ... แต่โปรดทราบว่าโซลูชันนี้ยังแปลงอาร์เรย์ที่ไม่ได้จัดทำดัชนีเป็นออบเจ็กต์ด้วยคู่ค่าคีย์ เช่นjson_encode(['a', 'b'], JSON_FORCE_OBJECT)จะกลับมา{"0": "a", "1": "b"}
Fendi Setiawan

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.