【问题标题】:How do you form an array in a JSON object for a query string?如何在 JSON 对象中为查询字符串形成一个数组?
【发布时间】:2010-09-23 21:04:05
【问题描述】:

在查询字符串中发送 JSON 对象中的数组时,每个数组元素是否应该具有相同的键?例如,如果我有这个 JSON 对象:

{"sodas[]": ["coke", "sprite", "fanta"]}

查询字符串是否应该像这样,所有键都完全相同 (sodas%5B%5D)?

sodas%5B%5D=coke&sodas%5B%5D=sprite&sodas%5B%5D=fanta

或者查询字符串中是否应该包含索引值或其他内容(sodas%5B0%5Dsodas%5B1%5D 等)?

sodas%5B0%5D=coke&sodas%5B1%5D=sprite&sodas%5B2%5D=fanta

【问题讨论】:

    标签: json jquery query-string web.py


    【解决方案1】:

    “sodas”键不带方括号的第一个语句会起作用。我不确定您使用的是哪种语言,但这里是 HTML、jQuery 和 PHP 的示例。

    HTML(文件:y.html)

    
    <!DOCTYPE html>
    <html>
    <head>
    <title>XYZ</title>
    <script
      type="text/javascript"
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    </head>
    <body>
    <input type="button" id="send" value="Send">
    <hr noshade>
    <div id="output"></div>
    <script type="text/javascript">
    var $output = $('#output');
    $('#send').click(function(e){
      e.preventDefault();
      var $json = '{"sodas":["coke","pepsi","fanta"]}';
      $.ajax({url:"/so/y.php",type:"post",dataType:"html",data:'json='+escape($json),
        success:function(obj){
          $output.html(obj);
        }
      });
    });
    </script>
    </body>
    </html>
    

    JavaScript escape() 函数将 json POST 参数格式化如下(取自 Firebug。)

    json=%7B%22sodas%22%3A%5B%22coke%22%2C%22pepsi%22%2C%22fanta%22%5D%7D

    PHP(文件:y.php)

    
    <?php
    $json = json_decode(stripslashes($_POST['json']));
    var_dump($json);
    

    浏览器输出显示 PHP 对象的 var_dump() 字符串表示,单键关联数组,其值为三个汽水品牌的数组。

    object(stdClass)#1 (1) { ["sodas"]=> array(3) { [0]=> string(4) "coke" [1]=> string(5) "pepsi" [2]= > 字符串(5) “芬达” } }

    【讨论】:

    • 感谢 JT 的回复。我没有使用字符串作为data 参数,而是使用了一个实际对象:var $json = {"sodas":["coke","pepsi","fanta"]}; 我知道这是受支持的。是对的吗?所以我们也应该在这里没有escape。使用本机 JavaScript 对象应该意味着我在服务器上以现成的格式获取它。如果我确实使用了一个字符串,就像你展示的那样,那么我必须自己在服务器上解压它,我想避免这种情况。我正在使用基于 Python 的 Web 框架 (webpy)。 +1,因为您的解决方案是有效的解决方法。
    • 嗯。我不确定如何通过网络获取 JSON 对象,而不是先对其进行序列化。对 SO 的普遍共识指向 json2.js,它提供了一个 JSON.stringify() 方法,并且可以直接用于 JavaScript 对象,无论是否使用 var x={"sodas":["pepsi","coke"," 显式创建芬达"]};或隐含使用 var x = new Object(); 等。如果使用 Python 2.6+,则 json 模块可用于将其解码为 Python 对象(没有方法 AFAIK 的数据结构。)我仍然最终使用 escape() 来翻译 {} 和 [] 虽然 CGI 程序接受了 POST 的任何一种方式。
    • 好的。我将接受序列化 JSON 对象作为正确答案。 jQuery 有 getJSON() 方法,它支持可选的data 参数。文档说data 是随请求发送到服务器的映射或字符串。上面的第一个查询字符串是由 jQuery 的 getJSON() 方法使用 JSON 对象(不是字符串)作为数据生成的。我想,除了地图,它还可以处理 JSON 对象,但我想这只是一厢情愿。
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2020-06-03
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多