空のJSONオブジェクトを作成するには、通常次のようにします。
json_encode((object) null);
オブジェクトにnullをキャストすることはできますが、この解決策には他に好ましい方法や問題がありますか?
空のJSONオブジェクトを作成するには、通常次のようにします。
json_encode((object) null);
オブジェクトにnullをキャストすることはできますが、この解決策には他に好ましい方法や問題がありますか?
json_encode()
オブジェクトではなく文字列を返します。なぜこれを行うのですか?ここで何か不足していますか?
回答:
ドキュメンテーションはそれ(object) null
が空のオブジェクトになるということを指定しています、そのため、一部はコードが有効であり、それが使用するメソッドであると言うかもしれません。
他のタイプの値がオブジェクトに変換されると、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);
オブジェクトを動的辞書として使用している場合は(おそらくそうだと思います)、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
落とし穴。これまでに見つけたのは1つだけです:はに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 = '{}';
これを達成するために関数を使用することには、本当に意味がありません。
更新 あなたのコメントの更新に従って、あなたは試すことができます:
$test = json_encode(array('some_properties'=>new stdClass));
それがあなたがしてきたことよりも良いかどうかはわかりませんが。
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);