php Json変換関連知識(小結)
最近バグを探していますが、先端から伝わるjson空のオブジェクト{}が、phpによって空の配列[]に変換されてデータベースに保存されています。読み取り、先端に戻る時は、特殊な処理をしていません。先端に[]戻り、問題が発生します。
phpのjson切り替えに関する内容を整理することにしました。
インデックス配列
コードの例を見てください。
string(16)「[]a","bb","cc"」
インデックス配列はjson配列に変換されることが見られます。
関連配列はJsonに変わります
コードの例を見てください。
string(28)「{」a","b":"bb","c":"cc"""""""。
関連配列がJsonオブジェクトに変換されることが見られます。
実はインデックス配列も関連配列として書いてもいいです。コードを見てください。
string(16)「[]a","bb","cc"」
string(28)「{」2:「aa","3":"bb","4":"cc".」
最初を見ると、インデックス配列は関連配列となり、json_を使います。encodeの時は、やはりjson配列に変えました。第二の関連配列は、jsonオブジェクトに変換されます。
phpインデックス配列をJsonオブジェクトに強制的に変換します。
上にジュソンが見えますエンコードはインデックス配列をjson配列に変えました。強制的にjsonオブジェクトに変換するにはどうすればいいですか?
次の二つの方法が使えます。一つ目の方法は、json_です。encodeの場合は2番目のパラメータをJSON_と設定します。フォースOBJECT第二の方法は、まずphp配列をphpオブジェクトに強制的に変換し、phpオブジェクトをjsonオブジェクトに変換することです。
string(28)「{」0":"aa","1":"bb","2":"cc""。
object(stdClass)菗1(3){
[0"=>
string(2)「a」
[1)=>
string(2)「bb」
[2)=>
string(2)「cc」
)
string(28)「{」0":"aa","1":"bb","2":"cc""。
Jsonを行列に変換
Jsonをオブジェクトに変換
対象はJsonになります
コードの例を見てください。
string(11)「{」b":"b b bbb"""""""。
見ることができます。public変数だけあって、他はjsonに変換する時に全部捨てられました。
ここで冒頭で述べたのですが、「先端から伝わるjson空のオブジェクトを発見しました。phpによって空の配列に変換されてデータベースに保存されました。」
もともと私のコードはこのように実現されました。
データの保存に関する例示的なコード:
array(0){
)
string(2)「[」
データ関連の例示コードを取る:
{「status」:0、「column」:[]
今は上の問題を避けて、取り出したコードはこのように書くべきで、先端がjsonの空のオブジェクトに伝わることができます。データベースに保存するのも{}です。データベースから取り出して、先端に戻る時もjsonの空の対象です。
データを保存する関連コードはそのままにして、データの関連例コードを取ります。
phpのjson切り替えに関する内容を整理することにしました。
インデックス配列
コードの例を見てください。
$a = ['aa', 'bb', 'cc'];
$ret = json_encode($a);
var_dump($ret);
印刷結果は:string(16)「[]a","bb","cc"」
インデックス配列はjson配列に変換されることが見られます。
関連配列はJsonに変わります
コードの例を見てください。
$a = [ 'a' => 'aa', 'b' => 'bb', 'c' => 'cc'];
$ret = json_encode($a);
var_dump($ret);
印刷結果は:string(28)「{」a","b":"bb","c":"cc"""""""。
関連配列がJsonオブジェクトに変換されることが見られます。
実はインデックス配列も関連配列として書いてもいいです。コードを見てください。
$a = [ 0 => 'aa', 1 => 'bb', 2 => 'cc'];
$ret = json_encode($a);
var_dump($ret);
$a = [ 2 => 'aa', 3 => 'bb', 4 => 'cc'];
$ret = json_encode($a);
var_dump($ret);
印刷結果は:string(16)「[]a","bb","cc"」
string(28)「{」2:「aa","3":"bb","4":"cc".」
最初を見ると、インデックス配列は関連配列となり、json_を使います。encodeの時は、やはりjson配列に変えました。第二の関連配列は、jsonオブジェクトに変換されます。
phpインデックス配列をJsonオブジェクトに強制的に変換します。
上にジュソンが見えますエンコードはインデックス配列をjson配列に変えました。強制的にjsonオブジェクトに変換するにはどうすればいいですか?
次の二つの方法が使えます。一つ目の方法は、json_です。encodeの場合は2番目のパラメータをJSON_と設定します。フォースOBJECT第二の方法は、まずphp配列をphpオブジェクトに強制的に変換し、phpオブジェクトをjsonオブジェクトに変換することです。
$a = ['aa', 'bb', 'cc'];
$ret = json_encode($a, JSON_FORCE_OBJECT);
var_dump($ret);
$ret = (object)$a; // php php
var_dump($ret);
$ret = json_encode($ret); // php json
var_dump($ret);
印刷結果は:string(28)「{」0":"aa","1":"bb","2":"cc""。
object(stdClass)菗1(3){
[0"=>
string(2)「a」
[1)=>
string(2)「bb」
[2)=>
string(2)「cc」
)
string(28)「{」0":"aa","1":"bb","2":"cc""。
Jsonを行列に変換
$str = '{"name":"zhangsan", "age": 18}';
$ret2 = json_decode($str, true);
var_dump($ret2);
$str = '["q", "w", "e"]';
$ret = json_decode($str, true);
var_dump($ret);
array(2) {
["name"]=>
string(8) "zhangsan"
["age"]=>
int(18)
}
array(3) {
[0]=>
string(1) "q"
[1]=>
string(1) "w"
[2]=>
string(1) "e"
}
見られます。Json_decodeメソッドは、2番目のパラメータがtrueであれば、jsonオブジェクト/json配列をphp配列に変換します。Jsonをオブジェクトに変換
$str = '{"name":"zhangsan", "age": 18}';
$ret = json_decode($str);
var_dump($ret);
var_dump($ret->name);
object(stdClass)#1 (2) {
["name"]=>
string(8) "zhangsan"
["age"]=>
int(18)
}
string(8) "zhangsan"
ジュソンならdecodeメソッドに二番目のパラメータを加えないと、デフォルトはfalseです。jsonオブジェクト/json配列をphpの対象にします。phpの中のオブジェクトは、->を使ってその変数にアクセスできます。対象はJsonになります
コードの例を見てください。
class TestJson {
const CONST_VALUE_A = 'aaa';
public $b = 'bbb';
protected $c = 'ccc';
private $d = 'ddd';
public function hello() {
print_r("hello
");
}
public static $stValue = 'st';
}
$test = new TestJson();
var_dump($ret);
$ret = json_encode($test);
var_dump($ret);
印刷結果は:string(11)「{」b":"b b bbb"""""""。
見ることができます。public変数だけあって、他はjsonに変換する時に全部捨てられました。
ここで冒頭で述べたのですが、「先端から伝わるjson空のオブジェクトを発見しました。phpによって空の配列に変換されてデータベースに保存されました。」
もともと私のコードはこのように実現されました。
データの保存に関する例示的なコード:
//
$raw = file_get_contents('php://input');
$param = json_decode($raw, true);
var_dump($param);
$s = json_encode($param);
var_dump($s);
……
// $s
……
……
印刷結果は:array(0){
)
string(2)「[」
データ関連の例示コードを取る:
//
$column = json_deocde($c, true);
$resp = [
'status' => 0,
'column' => $column,
];
echo json_encode($resp);
印刷結果は:{「status」:0、「column」:[]
今は上の問題を避けて、取り出したコードはこのように書くべきで、先端がjsonの空のオブジェクトに伝わることができます。データベースに保存するのも{}です。データベースから取り出して、先端に戻る時もjsonの空の対象です。
データを保存する関連コードはそのままにして、データの関連例コードを取ります。
//
$column = json_deocde($c, true);
if (empty($column)) {
$column = (object)$column; // php php
}
$resp = [
'status' => 0,
'column' => $column,
];
echo json_encode($resp);
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。