Der beste Weg, um ein leeres Objekt in JSON mit PHP zu erstellen?

91

Um ein leeres JSON-Objekt zu erstellen, verwende ich normalerweise:

json_encode((object) null);

Das Casting von Null für ein Objekt funktioniert, aber gibt es einen anderen bevorzugten Weg und / oder ein Problem mit dieser Lösung?

pna
quelle
Warum würden Sie null in ein JSON-Objekt konvertieren? Wäre das Endergebnis nicht {}? Das kannst du einfach machen.
Ayman Safadi
1
(Objekt) (Array ()) vielleicht? Ihre Lösung klingt gut.
Malletjo
1
json_encode()Gibt einen String zurück, kein Objekt. Warum das? Vermisse ich hier etwas?
Telmo Marques
2
Nun, tatsächlich kommt "{}" als String heraus! Ich möchte ein Ergebnis wie: {"some_property": {}}, das ein leeres JSON-Objekt ist. Ich konvertiere eine Null in ein Objekt, weil ich momentan keine andere Lösung kenne;)
pna
Ich mag deine Lösung 8]
Andrew

Antworten:

110

Ihre Lösung könnte funktionieren ..

In der Dokumentation wird angegeben, dass (object) nullein leeres Objekt erstellt wird. Einige sagen daher möglicherweise, dass Ihr Code gültig ist und dass es sich um die zu verwendende Methode handelt.

PHP: Objekte - Handbuch

Wenn ein Wert eines anderen Typs in ein Objekt konvertiert wird, wird eine neue Instanz der integrierten Klasse stdClass erstellt. Wenn der Wert NULL war, ist die neue Instanz leer.


.. aber versuchen Sie es sicher zu halten!

Obwohl Sie nie wissen, wann / ob sich das oben Gesagte ändern wird, {}können Sie einen Hack wie den folgenden verwenden , wenn Sie zu 100% sicher sein möchten, dass Sie immer mit einem in Ihren verschlüsselten Daten enden.

json_encode (json_decode ("{}"));

Obwohl es langweilig und hässlich ist, gehe ich davon aus / hoffe, dass json_encode / json_decode mit dem einen und anderen kompatibel ist und immer Folgendes als wahr bewertet:

$a = <something>;

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

Empfohlene Methode

json_decode ("{}")wird stdClassstandardmäßig eine zurückgeben, wobei die folgenden Angaben als sicher gelten sollten. Wie bereits erwähnt, ist es so ziemlich das Gleiche wie zu tun (object) null.

json_encode (new stdClass);
Filip Roséen - refp
quelle
1
Nach der Verwendung von "new ArrayObject ()" oder "(object) null" erhalte ich => "Object" und nicht '{}' als Antwort. mit php 5.6.29.
Rohitmb
80

Wenn Sie Objekte als dynamische Wörterbücher verwenden (und ich denke, Sie tun dies), dann möchten Sie wahrscheinlich ein ArrayObject verwenden .

Es wird in das JSON-Wörterbuch abgebildet, auch wenn es leer ist. Es ist großartig, wenn Sie zwischen Listen (Arrays) und Wörterbüchern (assoziativen Arrays) unterscheiden müssen:

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

Sie können es auch nahtlos bearbeiten (wie bei einem assoziativen Array), und es wird weiterhin ordnungsgemäß in ein Wörterbuch gerendert:

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

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

Wenn dies in beide Richtungen 100% kompatibel sein soll , können Sie es auch json_decodeso umbrechen , dass es ArrayObjectsanstelle von stdClassObjekten zurückgegeben wird (Sie müssen den Ergebnisbaum durchlaufen und alle Objekte rekursiv ersetzen, was eine ziemlich einfache Aufgabe ist).

Fallstricke . Nur eine habe ich bisher gefunden: is_array(new ArrayObject())bewertet zu false. Sie müssen is_arrayVorkommen finden und durch ersetzen is_iterable.

Wrygiel
quelle
5
Dies ist die richtigste Antwort hier, sie macht genau das, was in diesem Fall benötigt wird
Avi Kapuya
2
Danke, das ist die beste Antwort und passt genau zu meinen Bedürfnissen. Bevor ich dies las, begann mein Code mit jsonResponse = array()und wurde dann dynamisch von einer Schleife gefüllt. Wenn die Schleife keine einzige Iteration hatte, wurde das "leere" Objekt (oder Wörterbuch, wie Sie es nennen) so codiert, wie []alle anderen Fälle als "{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 = {}` und codiert wurden json_encode überhaupt nicht zu verwenden ist zwecklos.
user2690527
Das Gotcha sollte nicht zutreffen - da es ArrayObjectimplementiert ist iterable, können Sie sowohl den Typhinweis is_iterable($foo)als auch den iterableTyphinweis verwenden array, was Sie sowieso tun sollten, um sich die Option zu überlassen ArrayAccess, beispielsweise Instanzen von zu übergeben.
Moritz Friedrich
Cool! Die Antwort wurde aktualisiert.
Wrygiel
17

Gibt json_encode()einfach einen String aus einem PHP-Array / object / etc. Zurück. Sie können den gleichen Effekt viel effizienter erzielen, indem Sie Folgendes tun:

$json = '{}';

Es macht wirklich keinen Sinn, eine Funktion zu verwenden, um dies zu erreichen.

UPDATE Gemäß Ihren Kommentaraktualisierungen können Sie Folgendes versuchen:

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

Obwohl ich nicht sicher bin, ob das besser ist als das, was Sie getan haben.

rdlowrey
quelle
1
Nein, das ist eine Zeichenfolge mit einigen Klammern. Ich möchte etwas erreichen wie: {"some_properties": {}} ... NICHT {"some_properties": "{}"}, das anders ist.
pna
Oh Scheiße, ich habe zu viel Zeit damit verbracht, meinen Beitrag zu schreiben. 8 Minuten zu spät haha!
Filip Roséen - refp
@refp Haha schwer mit der enzyklopädischen Antwort zu konkurrieren :)
Rdlowrey
hehe sorry rdlowrey aber @refp war sehr erschöpfend;)
pna
9

Um ein leeres Objekt in JSON mit PHP zu erstellen, habe ich verwendet

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

welches produziert

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

was notwendig ist, weil ich das später tun muss

if(is_object($json))
snow6oy
quelle
5

Ich mache immer (Object)[];, wie:

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

... in PHP damit herumspielen ...

$json = json_encode($json);

... jetzt ist es echtes JSON ...

Anuga
quelle
2

json_encode($array, JSON_FORCE_OBJECT)werde es auch tun. Siehe https://www.php.net/manual/en/function.json-encode.php

Marc Steven Plotz
quelle
Danke ... Beachten Sie jedoch, dass diese Lösung auch nicht indizierte Arrays in Objekte mit Schlüsselwertpaaren konvertiert. ZB: json_encode(['a', 'b'], JSON_FORCE_OBJECT)würde zurückkehren{"0": "a", "1": "b"}
Fendi Setiawan
1

Sie können auch verwenden

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

json_encode($var);
Rishabh Parashar
quelle