php Json変換関連知識(小結)

5273 ワード

最近バグを探していますが、先端から伝わるjson空のオブジェクト{}が、phpによって空の配列[]に変換されてデータベースに保存されています。読み取り、先端に戻る時は、特殊な処理をしていません。先端に[]戻り、問題が発生します。
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);
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。