6

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

在阅读大量文章说json是要走的路之后,我想来回添加数组和非数组数据的传递!!!!但是......而且json也不安全,......放大括号,不要放大括号 - 使用json解码,不要使用它,确保顶部项目是一个对象,有人说在顶部放一个“d”,有些使用序列化,有些不使用它。我是否必须在数据周围放置花括号?还是 Jquery。有些人说还要添加一个标头,指定 application/json 或其他一些标头……而其他人则说它破坏了 IE7……有些人说要添加……

"dataType" : json

在ajax调用中。你明白我为什么现在糊涂了吗?

...和...在 PHP 中我是否还必须使用 rawurldecode?在 json 解码之前,因为我的 ajax 对数据进行了 urlencodes ......这太令人困惑了......

我不希望这成为一个比现在更大的安全漏洞......我想正确地做到这一点并规范。如果有规格。

谢天谢地,大多数人说......这是关于你如何使用它(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 从 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 返回单个 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); 
    ?>
    
于 2012-09-15T21:28:07.230 回答
2

好的。首先,考虑 JSON 的最简单方法是 JavaScript 对象的序列化表示(或 n 维、关联/非关联数组集,如果您在 PHP 中更容易思考的话)。

作为 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 并不真正需要任何模式,除非您自己创建一个模式来满足您的特定需求。
在这里,我有一系列专辑。每张专辑都有一个titleanartist和 a tracklist,这是一个歌曲标题数组。如果您的应用程序允许,您可以转换tracklist为一组track对象,每个对象都有自己的歌曲标题和持续时间,并链接到歌词或 .mp3 或任何您想要的内容。

因为我使用的是对象的索引数组(我不需要在我的专辑集合中给每个专辑一个关联名称 - 索引数组可以保存它们),所以 JSON 字符串包含在方括号中,方式相同JS 数组是(JS 数组是index-only)。

与 XML 相比,它确实是轻量级的。

如果您所做的只是来回发送一些键和值,那么在 RESTful API 之上的一些简单查询参数就绰绰有余了。

如果您发送的东西更像是“关联数组”(JS 中的一个对象),那么 JSON 同样有效,如下所示:

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

您只发送了一个对象,因为您只有一个对象要发送。对象在 JS 中用大括号表示,因此在 JSON 中,如果您有一个具有命名属性的对象,它将被包裹在大括号中。

注意 3: *如果您使用 jQuery 之类的库,或者从 Twitter Search 之类的 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......它默认为一维数组,这真的很愚蠢,而且很容易忘记。用于json_encode将您的数组(索引或关联,或两者的 n 维组合)转换为 JSON 字符串。

所以要对数据进行操作,你需要做的就是编写一些函数来遍历你自己的数组/对象结构,做你想让他们做的事情,而不是担心丑陋的基于 DOM 的节点遍历, XML 样式。

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

当您通过网络发送这些信息时,我的建议是使用简单的“文本”标题。如果您使用 MIME 类型发送它们application/json,则无需以任何语言进行任何解码。 但是,IE6 和 IE7 绝对没有对 JSON 的原生支持。因此,如果您发送该 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 = { 孩子 : { 父母 : myObj } };

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

所以,是的,JSON 和你想要的一样安全。它不允许使用函数,所以只要你永远不会eval收到你收到的东西,而是以受控方式序列化和反序列化,访问某些东西并让它在你的脸上炸毁是没有害处的......

...当然,像往常一样清理您的输入和输出,它会像其他任何东西一样安全的数据传输机制。

附录:不要像某些人建议的那样费心手动构建 JSON 字符串……当您可以在更短的时间内创建数组/对象并遍历它们时,这很丑陋,容易出错,而且不值得付出努力,扩展它们,不管怎样,然后让 JSON 在你的结构中递归并随它进行序列化。

于 2012-09-16T04:15:46.313 回答
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
        )
    )
*/
于 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 回答