PHPを使用してJSONで空のオブジェクトを作成する最良の方法は?


93

空のJSONオブジェクトを作成するには、通常次のようにします。

json_encode((object) null);

オブジェクトにnullをキャストすることはできますが、この解決策には他に好ましい方法や問題がありますか?


nullをJSONオブジェクトに変換するのはなぜですか?また、最終結果は{}ではないでしょうか?あなたはそれを行うことができます。
アイマンサファディ2011

1
(オブジェクト)(配列())多分?あなたのソリューションはいいですね。
malletjo 2011

1
json_encode()オブジェクトではなく文字列を返します。なぜこれを行うのですか?ここで何か不足していますか?
Telmo Marques

2
実際、「{}」は文字列として出力されます。空のjsonオブジェクトである{"some_property":{}}のような結果が必要です。私はnullをオブジェクトに変換するので、今のところ他のソリューションはわかりません;)
pna

私はあなたのソリューションが好きです8]
Andrew

回答:


112

あなたのソリューションはうまくいくかもしれません。

ドキュメンテーションはそれ(object) nullが空のオブジェクトになるということを指定しています、そのため、一部はコードが有効であり、それが使用するメソッドであると言うかもしれません。

PHP:オブジェクト-マニュアル

他のタイプの値がオブジェクトに変換されると、stdClass組み込みクラスの新しいインスタンスが作成されます。値がNULLの場合、新しいインスタンスは空になります。


..しかし、それを安全に保つようにしてください!

上記がいつ変わるか、またはいつ変わるかはわかりませんが、100%確実にしたい場合は、常に{}エンコードされたデータに含まれることになるので、次のようなハックを使用できます。

json_encode (json_decode ("{}"));

面倒で醜いですが、json_encode / json_decodeは相互に互換性があり、常に次のことをtrueに評価することを前提としています。

$a = <something>;

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

推奨方法

json_decode ("{}")stdClass安全のために以下を使用するため、デフォルトごとにが返されます。ただし、前述のとおり、を実行するのとほとんど同じです(object) null

json_encode (new stdClass);

1
「新しいArrayObject()」または「(object)null」を使用した後、応答として「{}」ではなく=>「オブジェクト」を取得しています。PHP 5.6.29を使用します。
rohitmb

81

オブジェクトを動的辞書として使用している場合は(おそらくそうだと思います)、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返されるようにラップすることもできます(結果ツリーを調べてすべてのオブジェクトを再帰的に置き換える必要があります。これはかなり簡単なタスクです)。ArrayObjectsstdClass

落とし穴。これまでに見つけたのは1つだけです:はにis_array(new ArrayObject())評価されfalseます。is_array出現箇所を検索してで置き換える必要がありますis_iterable


5
これは、ここで最も正しい答えです。この場合に必要なことを正確に実行します
Avi Kapuya 14

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

落とし穴は適用しないでください-はをArrayObject実装しているため、の代わりにタイプヒントを使用するiterableこともできます。たとえば、のインスタンスを渡すオプションをそのままにしておく必要があります。is_iterable($foo)iterablearrayArrayAccess
Moritz Friedrich

涼しい!回答を更新しました。
wrygiel

17

まあ、json_encode()単純にPHPの配列/オブジェクトなどから文字列を返します。次のようにすることで、同じ効果をより効率的に実現できます。

$json = '{}';

これを達成するために関数を使用することには、本当に意味がありません。

更新 あなたのコメントの更新に従って、あなたは試すことができます:

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

それがあなたがしてきたことよりも良いかどうかはわかりませんが。


1
いいえ、それは括弧が入った文字列です。{"some_properties":{}} ... NOT {"some_properties": "{}"}のようなものを実現したいと思います。
pna

私の投稿を書くのにあまりにも多くの時間を費やしました。
FilipRoséen-

@refpハハは百科事典の答えと競争するのが難しい:)
rdlowrey 2011

hehe申し訳ありませんがrdlowreyですが、@ refpは非常に徹底的でした;)
pna

9

PHPを使用してJSONで空のオブジェクトを作成するには

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

生産した

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

後で必要になるので、これは必要です。

if(is_object($json))

5

私はいつもそうします(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"}
フェンディセティアワン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.