ในการสร้างออบเจ็กต์ JSON ว่างฉันมักจะใช้:
json_encode((object) null);
การแคสต์โมฆะให้กับออบเจ็กต์ใช้งานได้ แต่มีวิธีอื่นที่ดีกว่าและ / หรือปัญหาใด ๆ กับโซลูชันนี้หรือไม่?
ในการสร้างออบเจ็กต์ JSON ว่างฉันมักจะใช้:
json_encode((object) null);
การแคสต์โมฆะให้กับออบเจ็กต์ใช้งานได้ แต่มีวิธีอื่นที่ดีกว่าและ / หรือปัญหาใด ๆ กับโซลูชันนี้หรือไม่?
json_encode()
ส่งคืนสตริงไม่ใช่วัตถุ ทำแบบนี้ทำไม? ฉันขาดอะไรที่นี่?
คำตอบ:
เอกสารระบุว่า(object) null
จะส่งผลให้วัตถุว่างเปล่าบางคนอาจบอกว่ารหัสของคุณถูกต้องและเป็นวิธีการที่จะใช้
ถ้าค่าของชนิดอื่นถูกแปลงเป็นอ็อบเจ็กต์อินสแตนซ์ใหม่ของคลาสในตัว 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);
ถ้าคุณใช้เป็นวัตถุพจนานุกรมแบบไดนามิก (และผมคิดว่าคุณทำ) แล้วฉันคิดว่าคุณต้องการใช้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_array
is_iterable
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 เลยก็ไร้ผล
ArrayObject
การใช้งานiterable
คุณสามารถทำได้ทั้งสองis_iterable($foo)
อย่างและใช้iterable
คำใบ้ประเภทแทนarray
ซึ่งคุณควรทำต่อไปเพื่อปล่อยให้ตัวเองมีตัวเลือกในการส่งผ่านอินสแตนซ์ArrayAccess
เช่น
ดีjson_encode()
ก็กลับสตริงจากอาร์เรย์ PHP / วัตถุ / ฯลฯ คุณสามารถบรรลุเอฟเฟกต์เดียวกันได้อย่างมีประสิทธิภาพมากขึ้นโดยทำ:
$json = '{}';
ไม่มีประโยชน์อะไรเลยในการใช้ฟังก์ชันเพื่อทำสิ่งนี้ให้สำเร็จ
UPDATE เป็นต่อการปรับปรุงความคิดเห็นของคุณคุณอาจลอง:
$test = json_encode(array('some_properties'=>new stdClass));
แม้ว่าฉันไม่แน่ใจว่าจะดีไปกว่าสิ่งที่คุณทำอยู่ก็ตาม
ในการสร้างวัตถุว่างใน JSON ด้วย PHP ฉันใช้
$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);
ซึ่งผลิต
stdClass Object
(
[status] => 202
[message] => Accepted
)
ซึ่งเป็นสิ่งที่จำเป็นเพราะในภายหลังฉันต้องทำสิ่งนี้
if(is_object($json))
ฉันมักจะทำ(Object)[];
เช่น:
$json = (Object)[]; // [] could also be array()
... เล่นกับมันใน PHP ...
$json = json_encode($json);
... ตอนนี้เป็น JSON จริง ...
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"}
คุณยังสามารถใช้
$var = ["key" => (object) array()];
json_encode($var);