6

私はjqueryを初めて使用し、昨夜早くjsonについて読み始めました。 単純なデータをphpスクリプトに渡し、データを処理して単一の値を返す、動作するajax呼び出しがあります。よく働く。

配列と非配列データの受け渡しを前後に追加したいと思います。また、jsonが進むべき道であるという記事の山を読んだ後、追加したいと思います!!!! しかし...また、jsonは安全ではありません、...中かっこを入れてください、中かっこを入れないでください-jsonデコードを使用し、使用しないでください。一番上のアイテムがオブジェクトであることを確認してください。シリアル化を使用するものもあれば、使用しないものもあります。データの周りに中かっこを配置する必要がありますか?またはJqueryを行います。アプリケーション/jsonまたは他のヘッダーを指定するヘッダーも追加すると言う人もいれば、IE7を壊すと言う人もいます...追加すると言う人もいます...

"dataType" : json

ajax呼び出しで。私が今混乱している理由がわかりますか?

...および...PHPでは、rawurldecodeも使用する必要がありますか?私のajaxがデータをurlencodeするので、jsonデコードの前に...それはすっごく混乱しています...

これがすでにあるよりも大きなセキュリティホールになることを望んでいません...私はそれを適切にそしてSPECにしたいと思います。スペックがある場合。

ほとんどの人はありがたいことに言います...それはあなたがそれをどのように使うか(jquery、JSON)などについてであり、それはそれを「安全」にします。そして安全とは...つまり、適切に使用されます。クライアント側にはこれまで安全なものはありません。

私が立ち往生しているのは簡単ですが、9時間以上読んだ後、決定的な答えを見つけることができません。言語(Jquery)を作成する人々が、次のような例を記述できないのはなぜですか... jsonサポートが含まれているので、これが適切な方法です!?!

そして、はい、私は以前に短い質問をしたことがあり、物事を研究していない、または「十分に調べていない」と非難され、批判されたため、この上部で少し言葉遣いをしています。少なくとも5時間以上の集中的な読書、ウェブサイトのスキャンなど。通常、私は9時間以上経ってからここに来るだけです...

...しかし、私が見つけた情報は壊れていて、古く、あまりにも多くの断片になっているので、完璧にやりたいです!!! :)これまでに見つけた最高のウェブサイトは、ちらつきのある写真を取り込むためのものでしたが、適切に送信する方法が示されていなかったので、記事を見つけて幸せにそこに残しました...しかし、それを私の状況に適用する方法がわかりませんでした。 ..

必要なヒントについては、コードのコメントを参照してください。コードを修正して、これら2つのデータをやり取りできるようにします。また、各言語でtmp変数に値を割り当てて、どのように処理できるかを確認できます。渡されたデータから情報を抽出しますか?ありがとう...

JQUERY / JS(私の古いコード)(コードスニペット)

    //Here's some sample data... - HOW DO I SEND THIS AS JSON (please) back and forth?
    var myarray = new Array();
    myarray.push("One");
    myarray.push("Two");
    myarray.push("Three");
    var someOtherData = "helpmeplease";

    $.ajax({
        url: "../../ajax/ajax.php",
        type: 'POST',
        data: ({
            "testarray" : myarray,
            "somemoredata" : someOtherData
        }),
        success: function(results) {
            // what do I do with results?  please alert the 2 passed variables back from php
            // for example alert("Test:" . results[0] . results.someOtherData) or however you
            // access the returned values...

PHP RECEIVE FROM AJAX(私の古いテストコード)

     $test1 = rawurldecode($_POST["somemoredata"]);
     $test2 = rawurldecode($_POST["testarray"]);
     $test3 = testarray[0]; // should be One

PHPリターン

     // please send any data back to the Ajax call 1 array, 1 normal data please and alert
     // the data please so I can see how it's pulled back out...
     return $data; // 1 array, 1 normal variable please

私のものについてのより多くの情報...

  • 私のウェブサイトはUTF-8でエンコードされています

  • 私のデータセットは4メガ未満になります。おそらく200k未満です。

  • クロスドメインのものは発生しません

  • 私はナンス、ページごとのトークン認証システムを持っています。

  • データには何を入れることができますか?なんでも?JSONコードを壊したり、データをやり取りしたりするシンボルや、含めるべきではないものはありますか?

  • 他のヒント、提案、警告はありますか?

お時間をいただきありがとうございます。

4

4 に答える 4

5

データをJSONとして送信する必要はありません。つまり、他のライブラリを無料で含めることを意味します。jQueryを使用してデータを配列として送信し、PHPスクリプトで配列として読み取ることができます。

例えば:

  1. PHPから単一の変数を返す:

    <script type="text/javascript">
    $(window).load(function(){
        var myarray = new Array();
        myarray.push("One");
        myarray.push("Two");
        myarray.push("Three");
        var someOtherData = "helpmeplease";
    
        $.ajax({
            url: "../../ajax/ajax.php",
            type: 'POST',
            data: ({
                "testarray" : myarray,
                "somemoredata" : someOtherData
            }),
            success: function(results) {
                alert(results);
            }
        });
    });
    </script>
    

    とあなたのスクリプト:

    <?php
        $testarray = $_POST['testarray'];
        echo $testarray[0]; // prints One
        $someOtherData = $_POST['someOtherData']; // prints helpmeplease
    ?>
    
  2. データを配列およびその他の単一変数としてjQueryに返します。

    データを追加dataType: "json"してJSONとして返します。

    <script type="text/javascript">
    $(window).load(function(){
        var myarray = new Array();
        myarray.push("One");
        myarray.push("Two");
        myarray.push("Three");
        var someOtherData = "helpmeplease";
    
        $.ajax({
            url: "../../ajax/ajax.php",
            type: 'POST',
            dataType: 'json',
            data: ({
                "testarray" : myarray,
                "somemoredata" : someOtherData
            }),
            success: function(results) {
                alert(results.somemoredata); // will alert 'helpmeplease'
                alert(results.testarray[1]); // will alert 'Two'
            }
        });
    });
    </script>
    

    およびスクリプト:

    <?php
        // I used the same POST fields, but it can be any other data
        $array = array();
        $array = $_POST['somemoredata'];
        $array = $_POST['testarray'];
        echo json_encode($array); 
    ?>
    
于 2012-09-15T21:28:07.230 に答える
2

わかった。まず、JSON を考える最も簡単な方法は、JavaScript オブジェクト (または、PHP でより簡単に考える場合は、n 次元の連想/非連想配列のセット) のシリアル化された表現です。

PHP での例として、次のようにします。

$albums = array( array( "title" => "Dark Side of the Moon",
                        "artist" => "Pink Floyd",
                        "tracklist" => array( "Speak to Me", "Breathe", "..." ) ),

                 array( "title" => "Ten",
                        "artist" => "Pearl Jam",
                        "tracklist" => array( "Once", "Even Flow", "..." ) )
);

次のように、JavaScript で同じことをよりコンパクトな方法で行うことができます。

var albums = [
    {
      title : "Dark Side of the Moon",
      artist : "Pink Floyd",
      tracklist : [ "Speak to Me", "Breathe", "..." ]
    }, {
      title : "Ten",
      artist : "Pearl Jam",
      tracklist : [ "Once", "Even Flow", "..." ]
    }
];

2つはまったく同じものです。
JSON は配列とオブジェクトのコレクションをシリアル化し、JavaScript の実装とほとんど同じように見えます。

注 1: 以下の二重引用符はそれぞれエスケープする必要がありますが、実際には手動でエスケープすることはしません構文の強調表示が壊れます。これにより、より多くのことが得られると思います

[{"title":"Dark Side of the Moon","artist":"Pink Floyd","tracklist":["Speak to Me","Breathe","..."]},
{"title":"Ten","artist":"Pearl Jam","tracklist":["Once","Even Flow","..."]}]

ご覧のとおり、JSON は、特定のニーズを満たすために自分で作成するスキーマを除いて、実際にはスキーマを必要としません。
ここに、アルバムの配列があります。各アルバムには、曲名の配列である と がありtitleますartisttracklistアプリケーションが保証する場合は、オブジェクトtracklistの配列に変えることができtrack、それぞれに独自の曲名と長さ、歌詞へのリンク、.mp3 など、必要なことは何でもできます。

オブジェクトのインデックス付き配列を使用しているため (アルバム コレクションで各アルバムに連想名を付ける必要はありません。インデックス付き配列でそれらを保持できます)、JSON 文字列は角括弧で囲まれています。 JS配列は(JS配列はインデックスのみです)です。

XML と比較すると、非常に軽量です。

いくつかのキーと値をやり取りするだけの場合は、RESTful API にいくつかの単純なクエリ パラメーターを追加するだけで十分です。

「連想配列」(JS のオブジェクト) に近いものを送信する場合、次のような JSON も同様に有効です。

{"title":"For the Record","artist":"Nerds with Guitars","tracklist":["Sympathy for the Daleks","Hero","Stereotypical"]}

送信するオブジェクトが 1 つしかなかったため、送信したオブジェクトは 1 つだけです。JS ではオブジェクトは中かっこで示されるため、JSON では、名前付きプロパティを持つ単一のオブジェクトがある場合、中かっこで囲まれます。

注 3: *jQuery などのライブラリを使用したり、Twitter 検索などの API から JSON を取得したりする場合、返されるオブジェクトが 1 つしかなくても、.配列なので、最後の例を読むには次のようにする必要があるかもしれません:

var dataArr = JSON.parse(response),
    dataObj = dataArr[0]; //only object in array

displayTracklist(dataObj);

これらすべてをバニラ JS で自分で行っている場合は、応答を名前付きプロパティを持つオブジェクトとして返すか、任意の配列 (通常はオブジェクトの配列) として返すかを選択できます。1 つの呼び出し (ログイン POST データの送信など) が常に名前付きプロパティを持つ単一のオブジェクトを返し、他の呼び出しがオブジェクトのリストを返すことがわかっている場合 (ブログ投稿のコメントの取得など)、アプリに両方の種類がある可能性があります。ブログ ロールのブログ投稿の取得、またはマルチプレイヤー ゲームの各プレイヤーのサーバーからのデータの取得)。2 つのケースを異なる方法で処理するかどうかは、100% あなた次第です。

PHP 側では、 を使用json_decodeしてこれらを連想配列に変換します。必ずドキュメントを読んでくださいjson_decode... ...デフォルトは 1 次元配列です。これは本当にばかげており、忘れがちです。json_encode配列 (インデックス付き、連想、または 2 つの n 次元の組み合わせ) を JSON 文字列に変換するために使用します。

したがって、データを操作するには、醜いDOMベースのノードトラバーサルについて心配するのではなく、配列/オブジェクトの独自の構造をトラバースして、自分がやりたいことを行う関数をいくつか書くだけです。 XML スタイル。

JavaScript 側では、デコーディングとエンコーディングを使用JSON.parseして実行します。JSON.stringify

これらをネットワーク経由で送信する場合、単純な「テキスト」ヘッダーを使用することをお勧めします。の MIME タイプで送信する場合application/json、どの言語でもデコードを行う必要はありません。 ただし、IE6 および IE7 では、JSON のネイティブ サポートはまったくありませ。そのため、その MIME タイプを送信すると、アプリで特別な処理が必要になり、デコードする必要があるため、それらは適合しますが、それらのブラウザーでのみ...

物語の教訓:text/plainそしてvar dataObj = JSON.parse(jsonText);

IE6 および IE7 の場合は、Douglas Crockford のjson2.js. ファイルのダウンロードを の条件付きコメントの中に入れるかIE lte 7、全員に含めてください。これは非常に小さいので、JSON 対応のブラウザを使用している場合は何もしません。JSON のネイティブ実装は json2.js に基づいて構築されているため、必要な限り、IE6 および IE7 は Chrome21 および IE10 と同じ JSON 機能を備えています。

ほとんどの JS ライブラリには、json2 仕様に基づいた独自の組み込み JSON シリアライザー/デシリアライザーもあります。

仕様といえば... ...JSON に入れられるものと入れられないものは何ですか?

基本的に、データベースに基づくネイティブ JS オブジェクトであれば、何でもシリアル化できます。

したがって、関数、正規表現、DOM 要素、HTML5 API、その他のクレイジーなアイデアはありません...
しかし、文字列、数値 (すべての JS 数値は浮動小数点数であるため、JSON には数値型はありません)、ブール値、配列、およびオブジェクトはすべて含まれています。ただし、例外が 1 つあります。構造内に循環参照を含めることはできません。

var myObj = { 子 : { 親 : myObj } };

完全に有効な JavaScript。JSON はエンコードを拒否します。

そうです、JSON はあなたが作りたいと思うほど安全です。関数は許可されていないため、何かにアクセスして顔に爆発させても害はありません。ただし、受信したものを決してeval受信せず、代わりに制御された方法でシリアル化および逆シリアル化する限り...

...そしてもちろん、いつものように入力と出力をサニタイズします。そうすれば、他の何よりも安全なデータ転送メカニズムになります。

補遺:一部の人々が示唆するように、わざわざ JSON 文字列を手動で構築しないでください... ...配列/オブジェクトをより短い時間で作成し、それらをトラバースできる場合、それは厄介で、エラーが発生しやすく、努力する価値がありません、それらを拡張して、JSONに構造を再帰させ、それが進むにつれてシリアライズします。

于 2012-09-16T04:15:46.313 に答える
0

あなたの質問は少し曖昧です。一般に、あなたの質問は1つのことを明確に伝えています。それは、JSONとは何か、またはJSONの使用方法がわからないということです。したがって、答えは「研究」です。

一般的な答え:JSONはデータ交換用です。それをどのように使用するかは、特定の状況で何を達成しようとしているかに完全に依存します。例えば:

javascriptオブジェクトをJSON文字列としてエンコードする:

var myObj = {};
myObj.aString = 'a string of characters';
myObj.aList = ['a','b','c'];
var myJSON = JSON.stringify( myObj );
console.log( myJSON ); 
// {"aString":"a string of characters","aList":["a","b","c"]}
/*    
note - the function you use varies by browser/javascript engine.
libraries (jQuery, for example) have methods that can simplify this.
*/

JSON文字列をPHP配列にデコードする

$myJSON = '{"aString":"a string of characters","aList":["a","b","c"]}';
$myArray = json_decode( $myJSON,true );
print_r( $myArray );
/*
Array
    (
    [aString] => a string of characters
    [aList] => Array
        (
        [0] => a
        [1] => b
        [2] => c
        )
    )
*/
于 2012-09-16T02:28:59.113 に答える
-1

非常に長いので、私は投稿全体を読んでいませんが、この関数を見てください。変数を渡して同じ形式(配列またはjsonなど)で取得するようにしてください。

> http://php.net/manual/en/function.json-encode.php
> http://www.php.net/manual/en/function.json-decode.php
> http://api.jquery.com/jQuery.parseJSON/
于 2012-09-15T21:28:37.900 に答える