2010-09-23 32 views
0

Lors de l'envoi d'un tableau dans un objet JSON dans une chaîne de requête, chaque élément de tableau est-il supposé avoir la même clé? Par exemple, si j'ai cet objet JSON:Comment pouvez-vous former un tableau dans un objet JSON pour une chaîne de requête?

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

Si la chaîne de requête ressembler à ceci, avec toutes les touches exactement la même (sodas%5B%5D)?

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

Ou si les chaînes de requête ont une valeur d'index en eux ou quelque chose (sodas%5B0%5D, sodas%5B1%5D, etc.)?

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

Répondre

1

La première instruction sans les crochets pour la clé "sodas" fonctionnerait. Je ne suis pas sûr des langues que vous utilisez, mais voici un exemple avec HTML, jQuery et PHP.

HTML (fichier: 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> 

La fonction JavaScript escape() formaté le paramètre JSON POST comme suit

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

PHP (fichier (extrait de Firebug.): Y Php)


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

la sortie du navigateur affiche le var_dump() 'de la représentation de chaîne d' un objet PHP, mono-keye d tableau associatif avec la valeur étant un tableau de trois marques de soda.

 
object(stdClass)#1 (1) { ["sodas"]=> array(3) { [0]=> string(4) "coke" [1]=> string(5) "pepsi" [2]=> string(5) "fanta" } } 
+0

Merci pour la réponse, JT. Au lieu d'utiliser une chaîne comme argument 'data', j'ai utilisé un objet réel:' var $ json = {"sodas": ["coke", "pepsi", "fanta"]}; 'Je comprends que ceci est supporté . Est-ce correct? Donc, nous devrions aussi faire sans «échapper» ici. Utiliser un objet JavaScript natif devrait signifier que je l'obtiens dans un format prêt à l'emploi sur le serveur. Si j'utilise une chaîne, comme vous l'avez montré, je devrais la déballer moi-même sur le serveur, ce que je voudrais éviter. J'utilise un framework web basé sur Python (webpy). +1 puisque votre solution est une solution de contournement valide. –

+0

Hmmm. Je ne suis pas sûr comment obtenir l'objet JSON sur le fil autrement que pour le sérialiser en premier. Le consensus général sur SO pointe vers json2.js qui fournit une méthode JSON.stringify() et peut être utilisé directement sur l'objet JavaScript qu'il soit créé explicitement avec var x = {"sodas": ["pepsi", "coke", " fanta "]}; ou implicitement avec var x = new Object() ;, etc. Si vous utilisez Python 2.6+, le module json peut être utilisé pour le décoder en un objet Python (structure de données sans méthodes AFAIK.) J'ai quand même fini par utiliser escape() pour traduisez les {} et [] cependant, bien que le programme CGI ait accepté le POST de toute façon. – JTP

+0

OK. Je vais accepter la sérialisation de l'objet JSON comme réponse correcte. jQuery a la méthode getJSON(), qui supporte l'argument optionnel 'data'. La documentation dit 'data' est une carte ou une chaîne qui est envoyée au serveur avec la demande. La première chaîne de requête ci-dessus a été générée par la méthode getJSON() de jQuery en utilisant un objet JSON (pas une chaîne) comme donnée. Je me suis dit que, en plus d'une carte, il pouvait aussi gérer un objet JSON, mais je suppose que c'était juste un vœu pieux. –