Cách tốt nhất để tạo một đối tượng trống trong JSON với PHP?


93

Để tạo một đối tượng JSON trống, tôi thường sử dụng:

json_encode((object) null);

ép kiểu null đến một đối tượng hoạt động, nhưng có cách nào khác thích hợp hơn và / hoặc bất kỳ vấn đề nào với giải pháp này không?


Tại sao bạn lại chuyển đổi null thành một đối tượng JSON? Ngoài ra, kết quả cuối cùng sẽ không phải là {}? Bạn chỉ có thể làm điều đó.
Ayman Safadi

1
(object) (array ()) có thể không? Giải pháp của bạn có vẻ tốt.
malletjo

1
json_encode()trả về một Chuỗi, không phải một đối tượng. Tại sao làm điều này? Am i thiếu cái gì ở đây?
Telmo Marques

2
thực ra "{}" xuất hiện dưới dạng một chuỗi! Tôi muốn một kết quả như: {"some_property": {}} là một đối tượng json trống. Tôi chuyển đổi một null cho đối tượng vì tôi không biết bất kỳ giải pháp othere cho bây giờ;)
pna

Tôi thích giải pháp của bạn 8]
Andrew

Câu trả lời:


112

Giải pháp của bạn có thể hoạt động ..

Tài liệu chỉ định điều đó (object) nullsẽ dẫn đến một đối tượng trống, một số có thể nói rằng mã của bạn hợp lệ và đó là phương pháp để sử dụng.

PHP: Đối tượng - Thủ công

Nếu một giá trị thuộc bất kỳ kiểu nào khác được chuyển đổi thành một đối tượng, một phiên bản mới của lớp tích hợp stdClass sẽ được tạo. Nếu giá trị là NULL, phiên bản mới sẽ trống.


.. nhưng, cố gắng giữ nó an toàn!

Mặc dù bạn không bao giờ biết khi nào / nếu những điều trên sẽ thay đổi, vì vậy nếu bạn muốn chắc chắn 100% rằng bạn sẽ luôn kết thúc với một {}trong dữ liệu được mã hóa của mình, bạn có thể sử dụng một cuộc tấn công như:

json_encode (json_decode ("{}"));

Mặc dù nó tẻ nhạt và xấu xí, tôi vẫn giả định / hy vọng rằng json_encode / json_decode tương thích với cái này và cái khác và luôn đánh giá những điều sau là đúng:

$a = <something>;

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

Phương pháp đề xuất

json_decode ("{}")sẽ trả về một stdClassmỗi mặc định, sử dụng bên dưới sẽ được coi là an toàn. Mặc dù, như đã đề cập, nó khá giống với việc làm (object) null.

json_encode (new stdClass);

1
sau khi sử dụng "new ArrayObject ()" hoặc "(object) null", tôi đang nhận => "Object" chứ không phải '{}' làm phản hồi. sử dụng php 5.6.29.
rohitmb

81

Nếu bạn sử dụng các đối tượng làm từ điển động (và tôi đoán bạn cũng vậy), thì tôi nghĩ bạn muốn sử dụng ArrayObject .

Nó ánh xạ vào từ điển JSON ngay cả khi nó trống. Thật tuyệt nếu bạn cần phân biệt giữa danh sách (mảng) và từ điển (mảng kết hợp):

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

Bạn cũng có thể thao tác với nó một cách liền mạch (như cách bạn làm với một mảng kết hợp) và nó sẽ tiếp tục hiển thị đúng vào một từ điển:

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

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

Nếu bạn cần điều này tương thích 100% theo cả hai cách , bạn cũng có thể bọc json_decodeđể nó trả về ArrayObjectsthay vì các stdClassđối tượng (bạn sẽ cần đi bộ cây kết quả và thay thế đệ quy tất cả các đối tượng, đây là một nhiệm vụ khá dễ dàng).

Gotchas . Cho đến nay, chỉ có một điều tôi đã tìm thấy: is_array(new ArrayObject())đánh giá false. Bạn cần tìm và thay thế các is_arraylần xuất hiện bằng is_iterable.


5
Đây là câu trả lời đúng nhất ở đây, nó thực hiện chính xác những gì cần thiết trong trường hợp này
Avi Kapuya

2
Cảm ơn, đây là câu trả lời tốt nhất và chính xác phù hợp với nhu cầu của tôi. Trước khi đọc cái này, mã của tôi bắt đầu bằng jsonResponse = array()và sau đó nó được điền động bởi một vòng lặp. Nếu vòng lặp không có một lần lặp nào thì đối tượng "trống" (hoặc từ điển, như bạn gọi) được mã hóa như []trong khi tất cả các trường hợp khác được mã hóa thành "{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 = {}` và không sử dụng json_encode ở tất cả là vô ích.
user2690527

Không nên áp dụng gotcha - vì các thiết bị ArrayObjectthực hiện iterable, bạn có thể làm cả hai điều này is_iterable($foo)cũng như sử dụng iterablegợi ý loại thay vì array, bạn nên làm như thế nào để để lại cho mình tùy chọn chuyển các phiên bản chẳng ArrayAccesshạn.
Moritz Friedrich

Mát mẻ! Đã cập nhật câu trả lời.
wrygiel

17

Vâng, json_encode()chỉ cần trả về một chuỗi từ một mảng PHP / đối tượng / vv. Bạn có thể đạt được hiệu quả tương tự hiệu quả hơn nhiều bằng cách:

$json = '{}';

Thực sự chẳng ích gì khi sử dụng một hàm để thực hiện điều này.

CẬP NHẬT Theo cập nhật nhận xét của bạn, bạn có thể thử:

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

Mặc dù tôi không chắc điều đó tốt hơn những gì bạn đang làm.


1
nope, đó là một chuỗi có một số dấu ngoặc đơn bên trong, tôi muốn đạt được điều gì đó như: {"some_properties": {}} ... KHÔNG phải {"some_properties": "{}"} khác.
pna 21/12/11

Oh shit, dành quá nhiều thời gian để viết bài của tôi .. 8 phút quá muộn haha!
Filip Roséen - refp 21/12/11

@refp Haha khó khăn để cạnh tranh với các câu trả lời bách khoa :)
rdlowrey

hehe xin lỗi rdlowrey nhưng @refp đã rất đầy đủ;)
pna

9

Để tạo một đối tượng trống trong JSON với PHP, tôi đã sử dụng

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

cái nào sản xuất

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

điều đó là cần thiết, vì sau này tôi phải làm điều này

if(is_object($json))

5

Tôi luôn làm (Object)[];như:

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

... chơi xung quanh nó trong PHP ...

$json = json_encode($json);

... bây giờ nó là JSON thực ...



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.