PHP Manual
/
データ構造

PHPでのJson - 処理、生成、および書式設定

26. 11. 2019

Obsah článku

Jsonデータ形式は、クライアントとサーバー間で構造化されたデータの転送を容易にするために作成されました。

配列やオブジェクトをjsonに変換する

配列やオブジェクトをJsonに変換するために、PHPには json_encode という関数があります。

$user = [
'名前' => 'ヤン',
'苗字' => 'バラセック',
'役割' => [
'管理者',
'モデレーター',
],
];
echo json_encode($user);

生み出すだろう。

{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}

json_encode() 関数は他のデータ型も変換することができます。例えば、integer (整数)、string` (文字列) などを直接挿入することができる。

Json pretty print - 人間が読みやすいように

デフォルトの設定では、jsonは1つの長い文字列として生成されます。これは、なるべく場所を取らないようにするためです。

もし、より良い可読性を求めるのであれば、2番目のパラメータとして JSON_PRETTY_PRINT 定数を渡せばよいでしょう。

echo json_encode($users, JSON_PRETTY_PRINT);

生み出すだろう。

{
"名前": "ヤン",
"苗字": "バラセック",
"役割": [
"管理者",
"モデレーター"
]
}

jsonの書式設定 - カスタム書式ルール

PHPによる通常のjsonの書式設定には追加設定がなく、この出力のみで解決する必要があります。例えば、スペースではなくタブをインデントしたい場合(あるいは何らかの方法で生成規則を変更したい場合)、自分でプログラムしなければならない。

この関数はすでに基本的な書式設定を行うことができるので、あとはそれを修正するだけです。

function prettyJsonPrint(string $json): string
{
$result = '';
$level = 0;
$in_quotes = false;
$in_escape = false;
$ends_line_level = NULL;
$json_length = strlen($json);
for ($i = 0; $i < $json_length; $i++) {
$char = $json[$i];
$new_line_level = NULL;
$post = '';
if ($ends_line_level !== NULL) {
$new_line_level = $ends_line_level;
$ends_line_level = NULL;
}
if ($in_escape) {
$in_escape = false;
} else if ($char === '"') {
$in_quotes = !$in_quotes;
} else if (!$in_quotes) {
switch ($char) {
case '}':
case ']':
$level--;
$ends_line_level = NULL;
$new_line_level = $level;
break;
case '{':
case '[':
$level++;
case ',':
$ends_line_level = $level;
break;
case ':':
$post = '';
break;
case "":
case "\t":
case "\n":
case "\r":
$char = '';
$ends_line_level = $new_line_level;
$new_line_level = NULL;
break;
}
} else if ($char === '\\') {
$in_escape = true;
}
if ($new_line_level !== NULL) {
$result .= "\n" . str_repeat("\t", $new_line_level);
}
$result .= $char . $post;
}
return $result;
}

提供元:https://stackoverflow.com/questions/6054033/pretty…

例えば、入力。

{"キー1":[1,2,3],"キー2":"価値"}

としてフォーマットされています。

{
"キー1": [
1,
2,
3
],
"キー2": "価値"
}

というのは、各要素のインデントが統一されているため、より読みやすくなっています。

json記法をHTMLとして色付けする

キーやデータそのもの、個々の書式要素(特に閉じ括弧)に色を付けると便利な場合があります。

例えば、入力。

{"アクセス": {"トークン": {"issued_at": "2008-08-16T14:10:31.309353", "ぜついん": "2008-08-17T14:10:31Z", "アイド": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "サービスカタログ": [], "ユーザー": {"ユーザー名": "エイジェイ", "ロールリンク": [], "アイド": "16452ca89", "やくまわり": [], "名前": "エイジェイ"}}}

としてフォーマットされています。

{<br   "access": {
」となります。    "token": {
」となります。       "issued_at""2008-08-16T14:10:31.309353"
    "expires""2008-08-17T14:10:31Z"
<br     "id""MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
は。     },

。    "serviceCatalog": [
].    ], 

。    "user": {
」のようになります。     "username""ajay"

"username"</span    "roles_links": [
].     ], 

。     "16452ca89"
。    「役割」: [
][
][
][
]。     ], 

。     「名前」"ajay"
「名前」</span     }<br   }
。 }

これは、以下のような機能で実現できます。

function jsonColorFormater(string $json, string $indentation = "\t"): string
{
$crl = 0;
$ss = false;
$buffer = '';
for ($c = 0; $c < strlen($json); $c++) {
if ($json[$c] == '}' || $json[$c] == ']') {
$crl--;
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && (@$json[$c - 1] == ',' || @$json[$c - 2] == ',')) {
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && !$ss) {
$buffer .= '<span style="color:'.((@$json[$c - 1] == ':' || @$json[$c - 2] == ':') ? '#35D' : '#C22').';">';
}
$buffer .= $json[$c];
if ($json[$c] == '"' && $ss) $buffer .= '</span>。';
if ($json[$c] == '"') $ss = !$ss;
if ($json[$c] == '{' || $json[$c] == '[') {
$crl++;
$buffer .= "\n". str_repeat($indentation, $crl);
}
}
// HTMLソースを返す
return '<pre>' . $buffer . '</pre> <pre>';
}
// これを呼び出すだけで、フォーマットされた出力が返される
// echo jsonColorFormater($data, ' ');

https://stackoverflow.com/a/20953262/6777550 から引用し、根本的に書き直した機能です。

JSONからPHPの配列/オブジェクトに変換する

これは、json_decode()関数で実装でき、オブジェクトとして扱う必要のあるJsonからデータ構造を作ることができます。

$json = '{name": "Jan", "surname": "Barasek", "role": ["admin", "moderator"]}.';
$decode = json_decode($json);
echo $decode->name; // 'Jan'を返します。
// echo $decode->role;
//
// プロパティロールのため、これは不可能です
// 配列を含むので、反復処理する必要があります。
echo '<ul>';
foreach ($decode->role as $role) {
echo '<li>。' . $role . '</li>。'; // 箇条書きの後ろに役割を連続的に並べる
}
echo '</ul> </p';

javascriptでの処理

例えば、jQueryライブラリでは、json文字列は非常に簡単にオブジェクトにパースすることができます。

var json = '{name": "Jan", "surname": "Barasek", "role": ["admin", "moderator"]}.';
var parser = $.parseJSON(json);
document.write('名前' + parser.name);
console.log(parser); // デバッグのため、オブジェクト全体をコンソールに出力する

javascriptでは、一般的に、どんなjsonも有効なjavascriptオブジェクトであり、直接操作したり、そのプロパティにアクセスしたりすることができます。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024