PHP_PHP チュートリアルの JSON および JSON アプリケーション スキルについて-PHPチュートリアル-php.cn
PHP_PHP チュートリアルの JSON および JSON アプリケーション スキルについて WBOY オリジナル
2016-07-13 17:17:40 859ブラウズ
JSONの基本
簡単に言うと、JSON は JavaScript オブジェクトで表される一連のデータを文字列に変換し、関数間で、または Web クライアントからサーバー側のプログラムに簡単に渡すことができます。この文字列は少し奇妙に見えますが (後でいくつかの例を参照します)、JavaScript はこれを簡単に解釈し、JSON は名前と値のペアよりも複雑な構造を表現できます。たとえば、キーと値の単純なリストではなく、配列や複雑なオブジェクトを表現できます。
簡単なJSONの例
最も単純な形式では、名前と値のペアは次のように JSON で表すことができます:
{ "名": "ブレット" }
この例は非常に基本的なもので、実際には同等のプレーン テキストの名前と値のペアよりも多くのスペースを占有します。
名=ブレット
ただし、JSON は、複数の名前と値のペアを文字列化するときに真価を発揮します。まず、次のように、複数の名前と値のペアを含むレコードを作成できます:
{ "firstName": "Brett", "lastName": "McLaughlin", "email": "brett@newInstance.com" }
構文的には、名前と値のペアに比べて大きな利点はありませんが、この場合は JSON の方が使いやすく、読みやすいです。たとえば、上記の 3 つの値が同じレコードの一部であることが明らかになり、中括弧によって値が何らかの関連性を示します。
値の配列
値のセットを表す必要がある場合、JSON は読みやすさを向上させるだけでなく、複雑さを軽減することもできます。たとえば、人の名前のリストを表現したいとします。 XML では、多くの開始タグと終了タグが必要です。一般的な名前と値のペア (このシリーズの以前の記事で説明したものなど) を使用する場合は、独自のデータ形式を作成するか、キー名を person1 の形式に変更する必要があります。 -ファーストネーム。
JSON を使用する場合は、複数のレコードを中括弧でグループ化するだけです:
コードをコピーします コードは次のとおりです:
{ "people": [ { "firstName": "Brett", "lastName ":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } ]}
これを理解するのは難しくありません。この例では、people という変数が 1 つだけあり、その値は 3 つのエントリの配列であり、各エントリは名、姓、電子メール アドレスを含む個人のレコードです。上の例は、括弧を使用してレコードを単一の値に結合する方法を示しています。もちろん、同じ構文を使用して複数の値 (それぞれに複数のレコードが含まれる) を表すこともできます:
コードをコピー コードは次のとおりです:
{ "programmers": [ { "firstName" : "Brett" , "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason @servlets.com " }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } ], "authors": [ { "firstName ": "アイザック ", "姓": "アシモフ", "ジャンル": "サイエンス フィクション" }, { "名": "タッド", "姓": "ウィリアムズ", "ジャンル": "ファンタジー" } , { " firstName": "Frank", "lastName": "Peretti", "genre": "キリスト教小説" } ], "musicians": [ { "firstName": "Eric", "lastName" : "Clapton" , "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }
最も注目すべきここで重要なのは、複数の値を表すことができ、各値には複数の値が含まれるということです。ただし、レコード内の実際の名前と値のペアは、メイン エントリ (プログラマ、作成者、ミュージシャン) ごとに異なる場合があることにも注意してください。 JSON は完全に動的であるため、JSON 構造の途中でデータの表現方法を変更できます。
JSON 形式のデータを処理するときに従う必要がある事前定義された制約はありません。したがって、同じデータ構造内でデータの表現方法を変更することができ、同じものを異なる方法で表現することもできます。
JavaScript での JSON の使用
JSON 形式をマスターすれば、JavaScript での使用は簡単です。 JSON はネイティブ JavaScript 形式です。つまり、JavaScript での JSON データの処理には特別な API やツールキットは必要ありません。
JSON データを変数に代入する
たとえば、新しい JavaScript 変数を作成し、JSON 形式のデータ文字列をそれに直接割り当てることができます:
コードをコピーします コードは次のとおりです:
var people = { "プログラマー": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "ジェイソン", "姓":"ハンター", "メール": "jason@servlets.com" }, { "ファーストネーム": "エリオット", "姓":"ハロルド", "メール": "elharo@macfaq .com" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "SF" }, { "firstName": "Tad" , "lastName": "ウィリアムズ", "genre": "ファンタジー" }, { "firstName": "フランク", "lastName": "ペレッティ", "genre": "キリスト教小説" } ], "ミュージシャン": [ { "firstName": "エリック", "lastName": "クラプトン", "instrument": "ギター" }, { "firstName": "セルゲイ", "lastName": "ラフマニノフ", "楽器": "ピアノ" } ] }
これは非常に簡単です。これで、前に見た JSON 形式のデータが含まれます。ただし、データにアクセスする方法がまだ明らかになっていないため、これでは十分ではありません。
データにアクセスする
明らかではないかもしれませんが、上記の長い文字列は実際には単なる配列であり、JavaScript 変数に入れることでこの配列に簡単にアクセスできます。実際、配列要素を表すにはドット表記を使用するだけです。したがって、プログラマ リストの最初のエントリの姓にアクセスするには、JavaScript で次のようなコードを使用するだけです:
people.programmers[0].lastName;
配列のインデックス付けは 0 から始まることに注意してください。したがって、このコード行は最初に people 変数のデータにアクセスし、次に、programmers というエントリに移動し、次に最初のレコード ([0]) に移動し、最後に lastName キーの値にアクセスします。結果は文字列値「McLaughlin」になります。
同じ変数を使用した例をいくつか示します。
コードをコピー コードは次のとおりです:
people.authors[1].genre // 値は "fantasy" です people.musicians[3].lastName // これは 4 番目を指します。エントリ、 はありません people.programmers.[2].firstName // 値は "Elliotte" です
このような構文を使用すると、追加の JavaScript ツールキットや API を使用せずに、あらゆる JSON 形式のデータを処理できます。
JSONデータを変更する
ピリオドと括弧を使用してデータにアクセスできるのと同じように、同じ方法でデータを簡単に変更できます。
people.musicians[1].lastName = "ラフマニノフ";
文字列を JavaScript オブジェクトに変換した後、次のように変数内のデータを変更できます。
文字列に変換し直す
もちろん、オブジェクトをこの記事で説明されているテキスト形式に簡単に変換できない場合、すべてのデータ変更はほとんど意味がありません。この変換も JavaScript では簡単です:
文字列 newJSONtext = people.toJSONString();
以上です!これで、Ajax アプリケーションのリクエスト文字列など、どこでも使用できるテキスト文字列が完成しました。
さらに重要なのは、あらゆる JavaScript オブジェクトを JSON テキストに変換できることです。元々 JSON 文字列が割り当てられていた変数を扱えるだけではありません。 myObject という名前のオブジェクトを変換するには、同じ形式のコマンドを実行するだけです:
文字列 myObjectInJSON = myObject.toJSONString();
これが、JSON とこのシリーズで説明する他のデータ形式の最大の違いです。 JSON を使用する場合、簡単な関数を呼び出すだけで、すぐに使用できるフォーマット済みのデータを取得できます。他のデータ形式の場合は、生データとフォーマット済みデータの間の変換が必要です。ドキュメント オブジェクト モデル (独自のデータ構造をテキストに変換する関数を提供する) のような API を使用する場合でも、API を学習し、ネイティブ JavaScript オブジェクトと構文を使用する代わりに API のオブジェクトを使用する必要があります。
最終的な結論は、多数の JavaScript オブジェクトを扱う場合、リクエストでサーバー側プログラムに送信できる形式にデータを簡単に変換できるように、JSON がほぼ確実に良い選択であるということです。 。
PHPでのJSONのアプリケーション
今日のインターネットでは、AJAX はもはや聞きなれない言葉ではありません。 AJAX といえば、RSS をきっかけに登場した XML がすぐに思い浮かぶかもしれません。特に PHP5 や、最も軽量な SimpleXML などの多数の XML パーサーの登場により、XML 解析はおそらく問題ではなくなりました。ただし、AJAX の場合、XML 解析はフロントエンド Javascript のサポートに重点を置いています。 XML を解析したことがある人なら誰でも、ツリーとノードに混乱すると思います。 XML が非常に優れたデータ保存方法であることは否定できませんが、その柔軟性により解析が困難になります。もちろん、ここで言及する難しさは、この記事の主役である JSON に関連したものです。
JSONとは何ですか?このコンセプトについては繰り返しません。平たく言えば、PHP のシリアル化された文字列のようなデータ ストレージ形式です。データの説明です。たとえば、配列をシリアル化して保存すると、簡単に逆シリアル化して適用できます。 JSON にも同じことが当てはまりますが、クライアント側の Javascript とサーバー側の PHP の間に対話型のブリッジが構築される点が異なります。 PHP を使用して JSON 文字列を生成し、この文字列をフロントエンド Javascript に渡すと、それを簡単に JSON に変換して適用できます。平たく言えば、実際には配列のように見えます。 本題に戻り、JSON の使用方法。 PHP5.2 には JSON のサポートが組み込まれています。もちろん、このバージョンより前のバージョンの場合は、市場に多数の PHP バージョンの実装があるので、必要なものを使用してください。ここでは主に、PHP の JSON 組み込みサポートについて説明します。非常にシンプルな 2 つの関数: json_encode と json_decode (シリアル化とよく似ています)。 1 つはエンコード用、もう 1 つはデコード用です。最初にコーディングの使用方法を見てみましょう:
コードをコピーします コードは次のとおりです:
$arr = array( 'name' => 'Script Home' , 'ニック' => 'ディープスペース', '連絡先' => array( 'メール' => 'シェンコンアットqqドットコム', 'ウェブサイト' => 'http://www .jb51.net', ) ); $json_string = json_encode($arr); 配列を JSON 化するのは非常に簡単です。 UTF-8 以外のエンコードでは中国語の文字はエンコードできないため、gb2312 を使用して PHP コードを作成する場合は、iconv または mb を使用してコンテンツを変換する必要があることに注意してください。中国語から UTF-8 への変換は json_encode され、上記の出力は次のようになります: {"name":"/u9648/u6bc5/u946b","nick":"/u6df1/u7a7a","contact":{"email ":"shenkong at qq dot com","website":"http:////www.jb51.net"}}
これはシリアル化に非常に似ていると言いましたが、まだ信じていませんね。エンコード後、デコードする必要があります。 PHP には、対応する関数 json_decode が用意されています。 json_decode を実行すると、オブジェクトが取得されます。
コードは次のとおりです。
$arr = array( 'name' => 'スクリプト ホーム', 'nick' => '深宇宙', 'contact' => array( 'email' = > 'qq ドット コムのシェンコン', 'ウェブサイト' => 'http://www.jb51.net', ) $json_string = json_encode($arr); $json_string); print_r($obj); オブジェクト内のプロパティにアクセスできますか?もちろん、このように $obj->name を配列に変換して簡単に呼び出すこともできます:
コードをコピーします
コードは次のとおりです: $json_string = json_encode($arr );
$ obj = json_decode($json_string);
$arr = (array) $obj; PHP はキャッシュ生成以外にもあまり役に立たないような気がします。配列を直接保存する方が良いですが、この文字を Javascript で使用する方法を見てみましょう:
コードは次のとおりです:
上記では、この文字列を変数に直接代入すると、JavaScript の配列になります (技術用語では配列と呼ぶべきではありませんが、PHP の習慣により、理解しやすいように常に配列と呼んでいます)。このようにして、arr を簡単にトラバースしたり、やりたいことを何でも行うことができます。 AJAX についてはまだ触れていませんね。そうですね、考えてみてください。サーバーから返された responseText が XML ではなく JSON 文字列を使用している場合、フロントエンド Javascript がそれを処理するのに非常に便利ではないでしょうか。犬の絆創膏の使い方はこんな感じです。 実際、これを書いている時点では、データ保存形式の違いを除けば、JSON と XML の間に大きな違いはありませんが、以下に 1 つ言及しておきます。これは XML とはほとんど関係がありませんが、JSON のより広範なアプリケーション、つまりクロスドメイン データ呼び出しを示すことができます。セキュリティの問題により、AJAX はクロスドメイン呼び出しをサポートしていません。異なるドメイン名でデータを呼び出すことは非常に面倒ですが、解決策はあります (Stone の講義でプロキシについて言及しましたが、私には理解できません)。解決されます)。 2 つのファイルを作成しましたが、これらはクロスドメイン呼び出しを示すのに十分です。 メインファイルindex.html
コードをコピーします
コードは次のとおりです:
script type ="text/javascript" src="http://www.openphp.cn/demo/profile.php">
調整されたファイル profile.php コードをコピーします コードは次のとおりです:
$arr = array( 'name' => 'Script Home',
'nick' => 'Deep Space', 'contact' => array ( 'メール' => 'qq ドット コムの shenkong', 'ウェブサイト' => 'http://www.jb51.net', )
);
echo "getProfile($json_string)"; ?> 明らかに、index.html が profile.php を呼び出すと、JSON 文字列が生成され、パラメーターとして getProfile に渡され、ニックネームが div に挿入されます。 , このようにクロスドメインデータインタラクションが完了します、とてもシンプルですね。 JSON は非常にシンプルで使いやすいので、何を期待しているでしょうか? ^_^
サーバーサイド JSON
JSONをサーバーに送信する
JSON をサーバーに送信することは難しくありませんが、非常に重要であり、重要な選択がいくつかあります。ただし、JSON を使用すると決めたら、選択肢はシンプルで限られているため、考慮したり集中したりすることはあまりありません。重要なことは、できればできるだけ早く簡単に JSON 文字列をサーバーに送信できることです。
GET 経由で JSON を名前と値のペアとして送信します
JSON データをサーバーに送信する最も簡単な方法は、それをテキストに変換し、名前と値のペアとして送信することです。 JSON 形式のデータはかなり長いオブジェクトであり、リスト 1 のように見える可能性があることに注意することが重要です。
リスト 1. JSON 形式の単純な JavaScript オブジェクト
コードをコピーします
コードは次のとおりです:
var people = { "プログラマー": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason" , "lastName":"Hunter", "email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq. com" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "SF" }, { "firstName": "Tad", "lastName ": "ウィリアムズ", "ジャンル": "ファンタジー" }, { "名": "フランク", "姓": "ペレッティ", "ジャンル": "キリスト教小説" } ], "ミュージシャン": [ { "firstName": "エリック", "lastName": "クラプトン", "instrument": "ギター" }, { "firstName": "セルゲイ", "lastName": "ラフマニノフ", "instrument": "ピアノ" } ] }
名前と値のペアとしてサーバー側に送信する場合は、次のようになります:
コードをコピー コードは次のとおりです:
var url = "organizePeople.php?people= " + people.toJSONString(); xmlHttp.open("GET", url, true); xmlHttp.onreadystatechange = updatePage; xmlHttp.send(null);
これは良さそうですしかし、問題があります。JSON データにはスペースやさまざまな文字が含まれるため、Web ブラウザーはコンパイルを続行する必要があることがよくあります。これらの文字がサーバー上で (またはサーバーへのデータ送信処理中に) 混乱を引き起こさないようにするには、JavaScript のエスケープ() 関数に次のコードを追加する必要があります:
コードをコピーします コードは次のとおりです:
var url = "organizePeople.php?people=" +エスケープ(people.toJSONString()); request.open("GET", url, true); request.onreadystatechange = updatePage; request.send(null);
この関数は、スペース、スラッシュ、およびブラウザに影響を与える可能性のあるその他のものを処理し、それらを Web で使用可能な文字に変換できます (たとえば、スペースは %20 に変換されますが、ブラウザは変換されません)。変更せずにサーバーに直接渡すのではなく、スペース処理として扱います)。その後、サーバーは送信後にそれらを (通常は自動的に) 元の「外観」に戻します。
このアプローチには 2 つの欠点があります:
GET リクエストを使用して大きなデータの塊を送信する場合、URL 文字列には長さの制限があります。この制限は広いですが、オブジェクトの JSON 文字列表現は、特に非常に複雑なオブジェクトを扱う場合、思ったよりも長くなる可能性があります。
ネットワーク経由ですべてのデータをプレーン テキストで送信する場合、データ送信の不安は対処しきれないほど大きくなります。
つまり、上記は GET リクエストの 2 つの制限であり、単に JSON データに関連する 2 つの制限ではありません。ユーザー名と姓だけではない、フォーム内の選択内容など、より多くのコンテンツを送信する場合、これら 2 つはもう少し注意が必要になる場合があります。機密コンテンツや非常に長いコンテンツを処理するには、POST リクエストを使用できます。
POSTリクエストを使用してJSONデータを送信します
POST リクエストを使用して JSON データをサーバーに送信することにした場合、以下に示すように、コードに多くの変更を加える必要はありません:
コードをコピーします コードは次のとおりです。 :
var url = "organizePeople.php?timeStamp =" + new Date().getTime(); request.open("POST", url, true); request.onreadystatechange = updatePage; request.setRequestHeader ("Content-Type", "application/x-www -form-urlencoded"); request.send(people.toJSONString());
このコードの大部分は、POST リクエストの送信方法に焦点を当てた「Mastering Ajax、パート 3: Ajax の高度なリクエストとレスポンス」で見ており、よく知っているはずです。リクエストは GET ではなく POST を使用して開かれ、Content-Type ヘッダーは、取得できるデータをサーバーに事前に知らせるために設定されます。この場合、それは application/x-www-form-urlencoded であり、通常の HTML フォームからの場合と同様に、テキストが送信されていることをサーバーに知らせます。
もう 1 つの簡単なヒントは、URL の末尾に時間を追加することです。これにより、リクエストは最初に送信されたときにキャッシュされなくなりますが、このメソッドが呼び出されるたびに再作成されて再送信され、タイムスタンプが異なるため、URL はわずかに異なります。この手法は、スクリプトへの POST が実際に毎回新しいリクエストを生成し、Web サーバーがサーバーからの応答をキャッシュしようとしないようにするためによく使用されます。
JSONは単なるテキストです
GET を使用するか POST を使用するかに関係なく、重要な点は、JSON は単なるテキストであるということです。特別なコーディングは必要なく、すべてのサーバー側スクリプトでテキスト データを処理できるため、JSON を簡単に活用してサーバーに適用できます。 JSON がバイナリ形式または奇妙なテキスト エンコーディングである場合は、それほど単純ではありません。幸いなことに、JSON は単なる通常のテキスト データです (スクリプトは POST セクションでフォーム送信から受け取ることができ、Content-Type ヘッダーも で確認できます)。したがって、データをサーバーに送信するときにあまり心配する必要はありません。
サーバー上でJSONを解釈する
クライアント側の JavaScript コードを作成し、ユーザーが Web フォームや Web ページと対話できるようにし、処理のためにサーバー側のプログラムに送信するために必要な情報を収集すると、この時点でサーバーがアプリケーションになります (非同期で呼び出された場合)サーバー側プログラムを使用します。これは、私たちがいわゆる「Ajax アプリケーション」と考えるものの主役である可能性があります)。この時点で、クライアント側で行う選択 (JavaScript オブジェクトの使用や JSON 文字列への変換など) は、JSON データのデコードにどの API を使用するかなど、サーバー側で行う選択と一致する必要があります。
JSON を処理するための 2 つのステップ
サーバー側でどのような言語が使用されているかに関係なく、サーバー側で JSON を処理するには、基本的に 2 つの手順が必要です。
サーバー側プログラムの作成に使用される言語に対応する JSON パーサー/ツールボックス/ヘルパー API を見つけます。
JSON パーサー/ツールボックス/ヘルパー API を使用して、クライアントからリクエスト データを取得し、そのデータをスクリプトが理解できるデータに変換します。
上記はほぼ今知っておくべき一般的な内容です。次に、各ステップを詳しく紹介します。
JSONパーサーを探しています
JSON パーサーまたはツールキットを見つけるための最適なリソースは、JSON サイトです (リンクについては「参考文献」を参照)。 ここでは、形式そのものについてすべて学ぶことに加えて、ASP から Erlang、Pike、Ruby まで、JSON 用のさまざまなツールやパーサーへのリンクもあります。スクリプトを作成している言語に適したツールボックスをダウンロードするだけです。サーバー側のスクリプトとプログラムがこのツールボックスを使用できるようにするには、必要に応じてツールボックスを選択、拡張、またはインストールできます (サーバー側で C#、PHP、または Lisp を使用している場合はより柔軟になります)。
たとえば、PHP を使用している場合は、PHP 5.2 にアップグレードするだけで使用できます。この最新バージョンの PHP には、デフォルトで JSON 拡張機能が含まれています。実際、これは PHP を使用するときに JSON を処理する最良の方法です。 Java サーブレットを使用している場合は、json.org にある org.json パッケージを選択するのが明らかです。この場合、JSON Web サイトから json.zip をダウンロードし、それに含まれるソース ファイルをプロジェクトのビルド ディレクトリに追加できます。これらのファイルをコンパイルすると、すべての準備が整います。サポートされている他の言語でも同じ手順を使用できます。使用する言語は言語の習熟度によって異なります。使い慣れた言語を使用するのが最善です。
JSONパーサーを使用する
プログラムで利用可能なリソースを取得したら、あとは呼び出す適切なメソッドを見つけるだけです。たとえば、PHP の JSON-PHP テンプレートを使用しているとします。
コードをコピーします コードは次のとおりです:
// これは、より大きな PHP サーバー側スクリプトのコードの一部です require_once('JSON.php '); $json = new Services_JSON(); // POST データを受け入れてデコードします $value = $json->decode($GLOBALS['HTTP_RAW_POST_DATA']); //値を生の PHP として扱うようになりました
このテンプレートを使用すると、取得したすべてのデータ (配列形式、複数行、単一値、または JSON データ構造のもの) をネイティブ PHP 形式に変換し、$value 変数に配置できます。
org.json パッケージがサーブレットで使用されている場合、次のコードが使用されます:
コードをコピーします コードは次のとおりです:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuffer jb = new StringBuffer(); String line = null; try { BufferedReader Reader = request.getReader(); while (( line = Reader.readLine()) != null) jb.append(line); } catch (Exception e) { //エラーを報告 } try { JSONObject jsonObject = new JSONObject(jb.toString()) ; } catch (ParseException e) { // クラッシュして書き込みます throw new IOException("JSON リクエスト文字列の解析エラー"); } //...のようなメソッドを使用してデータを操作します... // int someInt = jsonObject.getInt("intParamName"); // String someString = jsonObject.getString("stringParamName"); // JSONObjectnestedObj = jsonObject.getJSONObject("nestedObjName"); // JSONArray arr = jsonObject.getJSONArray(" arrayParamName"); // etc... }
http://www.bkjia.com/PHPjc/621715.html www.bkjia.com true http://www.bkjia.com/PHPjc/621715.html 技術記事 JSON ベースの文字列、JSON は JavaScript オブジェクト内に表示される 1 つのデータセット转换を文字列にできます。その後、関数数の間で轻松地传递这个文字列、または异步に配置できます...
声明: この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。