混淆了使用json的正确方法

时间:2012-09-15 19:26:11

标签: php jquery ajax json

我是jquery的新手,昨晚才刚开始阅读json。 我有一个工作的ajax调用,它将简单数据传递给php脚本,处理数据并返回单个值。效果很好。

我想要来回添加数组和非数组数据的传递,并在阅读了一堆文章后说json是要走的路!!!!但是......也就是json不安全,...戴上牙套,不要戴牙箍 - 使用json解码,不要使用它,确保顶部物品是一个物体,有人说把“d”放在顶部,有些使用序列化,有些则不使用它。我是否必须在数据周围放置curley括号?或者是Jquery。有些人说还添加了一个标题,指定了application / json或其他一些标题......其他人说它打破了IE7 ......有些人说要添加......

"dataType" : json

在ajax调用中。你知道为什么我现在感到困惑吗?

...和...在PHP中,我还必须使用rawurldecode吗?在json解码之前,因为我的ajax urlencodes数据...它太混乱......

我不希望这是一个比现在更大的安全漏洞...我想要正确地做到和SPEC。如果有规格。

大多数人都感激地说...这是关于你如何使用它(jquery,JSON)等,这使它“安全”。安全......我的意思是,使用得当。客户端没有任何东西是安全的。

我坚持的很简单我很确定但是在阅读超过9个小时后我找不到明确的答案。为什么制作这些语言的人(Jquery)不能写一个例子说...现在我们已经包含了json支持,这是正确的方法!?!

是的,我在这个最重要的部分有点罗嗦,因为我以前曾提出过短期问题,并且遭到过抨击和批评,并被指责没有研究过的东西,或者当我从未提出问题时“没有充分研究”这里没有至少5个多小时的激烈阅读,扫描网站等等。通常我只会在9个多小时后来到这里......

...但是我发现的信息已经破碎,陈旧,而且太多了,我想完美地做到这一点! :)我到目前为止找到的最好的网站是用于拉动闪烁图片,但它没有显示如何正确发送所以我离开那里很高兴找到文章...但不知道如何应用于我的情况。 ..

请查看我的代码中的注释以获取我需要的提示,甚至更好 - 修复我的代码以便我可以来回发送这两个数据,并且在每种语言中都可以为tmp变量赋值所以我可以看到你如何从传递的数据中提取信息?谢谢...

JQUERY / JS(我的旧代码)(代码snippits)

    //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从AJAX接收(我的旧测试代码)

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

PHP RETURN

     // 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以下。

  • 没有跨领域的内容发生

  • 我有一个nonce,每页令牌身份验证系统,效果很好

  • 什么可以进入数据?什么吗?是否应该包含哪些符号或内容会破坏JSON代码或来回传递数据?

  • 任何其他提示,建议和警告?

感谢您的时间。

4 个答案:

答案 0 :(得分:5)

无需以JSON格式发送数据,这意味着无需包含其他库。您可以使用jQuery将数据作为数组发送,并在PHP脚本中将其作为数组读取。

例如:

  1. 从PHP返回单个var:

    <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); 
    ?>
    

答案 1 :(得分: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", "..." ]
    }
];

两者完全相同。
JSON将序列化该数组和对象的集合,看起来几乎与JavaScript实现完全相同。

注1: 下面的每个双引号都应该转义,但我真的不会手动执行
注2: 根据标准,整个事情很可能是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并不真正需要任何架构,除了您自己创建的架构,以满足您的特定需求。
在这里,我有一系列专辑。每张专辑都有titleartist以及tracklist,这是一系列歌曲标题。 如果您的应用程序需要保证,您可以将tracklist转换为track个对象的数组,每个对象都有自己的歌曲标题和持续时间,并链接到歌词或.mp3或您想要的任何内容。< / p>

因为我使用索引数组的对象(我不需要在我的相册集合中为每个相册指定关联名称 - 索引数组可以保存它们),所以JSON字符串包含在方括号,与JS数组相同(JS数组 仅索引 )。

与XML相比,它非常轻量级。

如果你所做的只是来回发送一些密钥和值,那么在RESTful API之上的一些简单查询参数就足够了。

如果你发送的东西更像是一个&#34;关联数组&#34; (JS中的一个对象),然后同样有效的是JSON,它看起来像:

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

您只发送了一个对象,因为您只有一个要发送的对象。 对象用JS中的大括号表示,所以在JSON中,如果你有一个带有命名属性的单个对象,那么它将用大括号括起来。

注意3: *如果你使用像jQuery这样的库,或者从像Twitter搜索这样的API中获取JSON,即使你只收回一个对象,它很可能会回到你的JS程序作为单个对象,在数组内部,所以阅读最后一个例子可能必须这样做:

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

displayTracklist(dataObj);

如果您在vanilla JS中自己完成所有这些操作,您可以选择响应是作为对象返回,具有命名属性,还是作为您喜欢的任何数组(通常是数组)对象)。 如果您知道一个调用(如发送登录POST数据)将始终返回具有命名属性的单个对象,并且其他调用将返回对象列表(例如获取博客帖子的评论,或者获取博客帖子的博客文章,或者在多人游戏中为每个玩家从服务器获取数据)。 您是否希望以不同的方式对待这两种情况是100%由您决定。

在PHP方面,您将使用json_decode将这些转换为关联数组。 一定要阅读json_decode上的文档......它默认为1维数组,这真的很愚蠢,很容易忘记。 使用json_encode将数组(索引或关联或两者的n维组合)转换为JSON字符串。

因此,要对数据进行操作,您需要做的就是编写一些将遍历您自己的数组/对象结构的函数,以执行您希望它们执行的操作,而不是担心基于DOM的丑陋节点 - 遍历,XML风格。

在JavaScript方面,您将使用JSON.parseJSON.stringify进行解码和编码。

当你通过网络发送这些内容时,我的建议是使用简单的&#34;文本&#34;头。 如果您使用MIME类型application/json发送它们,则无需使用任何语言进行任何解码。 HOWEVER ,IE6和IE7对JSON绝对具有 NO 原生支持。 因此,如果您发送该MIME类型,他们就会适应,因为他们需要在您的应用中进行特殊处理,您必须解码,但仅限于那些浏览器,等等......

故事的道德:text/plainvar dataObj = JSON.parse(jsonText);

对于IE6和IE7,请使用Douglas Crockford的json2.js。 要么将文件的下载放在IE lte 7的条件注释中,要么将其包含在每个人中 - 它很小,如果你有一个支持JSON的浏览器,它就赢了做任何事情。 JSON的本机实现是基于json2.js构建的,因此,只要您需要关注,IE6和IE7将具有与Chrome21和IE10相同的JSON功能。

大多数JS库也有自己的内置JSON序列化器/反序列化器,基于json2规范。

说到规格...... ...你能用和不能用JSON做什么?

基本上,你可以序列化任何基于数据的原生JS对象。

所以函数,RegEx,DOM元素,HTML5 API,你可能拥有的其他疯狂想法都是...... 但是字符串,数字(所有JS数字都是浮点数,所以JSON没有数字类型),布尔值,数组和对象都在,但有一个例外: 您的结构中不能包含任何循环引用。

var myObj = {child:{parent:myObj}};

完全有效的JavaScript。 JSON将拒绝对其进行编码。

所以是的,JSON和你想做的一样安全。 它不允许功能,所以只要你 永远不会eval你收到什么,那么访问某些东西并让它在你脸上爆炸是没有害处的/ em> 而是以受控方式序列化和反序列化......

...当然,一如既往地消毒您的输入和输出,它将像其他任何东西一样安全的数据传输机制。

附录:不要手动构建JSON字符串,就像有些人建议的那样...... ......当你可以在更短的时间内制作数组/对象,并遍历它们,扩展它们,无论如何,然后让JSON通过你的结构进行递归时,那是非常容易出错,容易出错的,并且不值得付出努力序列化它。

答案 2 :(得分:0)

你的问题有点模糊。一般来说,您的问题清楚地表达了一件事:您不知道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
        )
    )
*/

答案 3 :(得分:-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/