Để 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ạ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?
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?
Câu trả lời:
Tài liệu chỉ định điều đó (object) null
sẽ 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.
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.
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));
json_decode ("{}")
sẽ trả về một stdClass
mỗ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);
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ề ArrayObjects
thay 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_array
lần xuất hiện bằng is_iterable
.
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.
ArrayObject
thự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 iterable
gợ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 ArrayAccess
hạn.
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.
Để 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))
json_encode($array, JSON_FORCE_OBJECT)
cũng sẽ làm điều đó. xem https://www.php.net/manual/en/ Chức năng.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
sẽ trở lại{"0": "a", "1": "b"}
bạn cũng có thể dùng
$var = ["key" => (object) array()];
json_encode($var);