7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPの空配列をJSONの空オブジェクトとしてエンコードしたい時

Last updated at Posted at 2019-03-08

突然ですが、次のような配列をJSONエンコードしたい場合どうしましょう。

<?php

$json = ['hoge' => []];

簡単ですね。json_encodeを使えば次のような結果になるでしょう。

var_dump(json_encode($json));

// output:
// string(11) "{"hoge":[]}"

ただしこの際、空配列は[]として表現されています。これを空オブジェクトとして表現したい場合についてです。

JSON Objectの[]と{}

そもそものJSON Objectの[]{}についてです。Difference between { and [ when formatting JSON object - stack overflow にて解説がありますが、一見形が似ているこの2つは、もちろん異なるものです。

[]は、Arrayとしての扱いです。例えば次のようなJSON文字列は、Ford・BMW・Fiatという三要素を持った配列ということになります。

[ "Ford", "BMW", "Fiat" ]

{}は、Objectとしての扱いです。例えば次のようなJSON文字列は、key-valueの組み合わせで表現されたオブジェクトということになります。

{ "name":"John", "age":30, "car":null }

空配列を空オブジェクトとしてエンコード

冒頭見たようなPHPの空配列を、JSONの空オブジェクトとしてエンコードする場合は、JSON_FORCE_OBJECTというオプションを用います。

<?php

$json = ['hoge' => []];

var_dump(json_encode($json, JSON_FORCE_OBJECT));

// output:
// string(11) "{"hoge":{}}"

{}として表現することができました。

JSON_FORCE_OBJECTの注意

PHPの配列を安全にJSONシリアライズするという記事にて言及していただいていますが、JSON_FORCE_OBJECTは中の要素も再帰的にオブジェクトになってしまうよう。例えば、次のような三階層の連想配列をJSONエンコードした場合こうなります。

<?php

$json = ['hoge' => ['huga' => ['piyo' => 'aaa']]];

var_dump(json_encode($json, JSON_FORCE_OBJECT));

// output:
// string(32) "{"hoge":{"huga":{"piyo":"aaa"}}}"

場合によっては、そこまでしてほしくないんやということもありそうなので、用途に応じて使わないといけなそうですね。

以上。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?