JeuWeb - Crée ton jeu par navigateur

Version complète : XML vs JSON
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Actuellement je traite les requêtes AJAX en renvoyant du XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<content destination="mon ID de destination">
<texte><![CDATA[mon texte ici à mettre dans la destination]]></texte>
</content>
</response>
j'ai prévu de l'étendre en rajoutant des attributs à "content", notamment un mode="insert|append".

Le problème de l'XML, c'est que c'est très verbeux donc j'aimerai pouvoir obtenir le même comportement en JSON. Dans ma version actuelle, ca ne pose pas trop de problème!

{"mon ID de destination":"mon texte ici à mettre dans la destination"}

Mon souci, c'est que je n'arrive pas à trouver, pour l'instant, une représentation JSON qui pourrait intégrer de nouveaux attributs ni la manière de traiter le JSON en JS (avec JQuery).
en php json_encode() te transforme un array en objet JSON , vachement pratique...

en JS avec JQUERY et ajax, la parametre dataType: 'json' doit etre utilisé si tu recupere un objet json


function j_aime_ajax()
{
$(function()
{
$.ajax({url: 'http://www.example.com',
cache: false,
dataType: 'json',
success:function(json){ma_function_callback(json);},
error:function(XMLHttpRequest, textStatus, errorThrows){}
});
});
}

et un objet json est natif en JS me semble t il donc aucun soucis pour l'utiliser...

mais je ne suis pas tout à fait assez familier avec JS+JQUEYR+AJAX pour t'en dire d'avantage, mais mieux faut à mon avis que tu utilise json si tu fait de l'ajax, moins verbeux, natif en JS, etc...
L'équivalent rigoureux serait :


{
response: {
content: {
text: "Lorem ipsum dolor sit amet"
destination: 42,
}
}
}

Mais à mon sens, inclure le nœud racine n'est pas pertinent, tu peux simplifier vachement. Par exemple :


{
text: "Lorem ipsum dolor sit amet",
mode: "append",
destination: 42,
anything: [ "foo", "bar" ]
}

Aller au plus simple n'est pas un crime ! Tu ajoutes les attributs que tu veux : tu es libre de la structure. Smile

Quant à l'utilisation avec jQuery, là aussi c'est très simple. Tu indiques à jQuery que tu vas récupérer du JSON (soit via le dataType de la méthode ajax(), soit grâce aux méthodes raccourcies comme getJSON()) et lui va se charger de parser la réponse (en appelant la méthode JSON.parse(responseText)). Tu auras alors un objet directement utilisable !


$.getJSON(url, function(response){
alert(response.anything.join(", "));
});


Sephi-Chan
(09-02-2011, 11:59 PM)Sephi-Chan a écrit : [ -> ]Quant à l'utilisation avec jQuery, là aussi c'est très simple. Tu indiques à jQuery que tu vas récupérer du JSON (soit via le dataType de la méthode ajax(), soit grâce aux méthodes raccourcies comme getJSON()) et lui va se charger de parser la réponse (en appelant la méthode JSON.parse(responseText)). Tu auras alors un objet directement utilisable !

merci pour lui avoir donné des explications plus clair que les miennes Wink

perso j'utilises dataType: 'json' , je ne connaissais pas getJSON()...et je me pose la question : pourquoi faire compliquer (utiliser getJSON() ) alors que l'on peut faire simple (utiliser dataType: 'json') ?
Et bien, quand tu n'as besoin que d'un callback en cas de succès, autant utiliser les méthodes simplifiées, c'est plus léger à l'œil.

Je te retourne la question. Pourquoi écrirais-je :


$.ajax({
url: url,
dataType: 'json',
success: function(response){
alert(response.anything.join(", "));
}
});

Alors que je peux écrire :


$.getJSON(url, function(response){
alert(response.anything.join(", "));
});


Sephi-Chan
C'est marrant, tu n'as pas mentionné ce système tout a l'heure ^^
Du coup cela fait exactement la même chose donc?
getJSON() c'est aussi de l'AJAX en somme...
Bien sûr. Comme expliqué dans la documentation de getJSON() :

Citation :$.getJSON(url, [ data ], [ success(data, textStatus, jqXHR) ] )

This is a shorthand Ajax function, which is equivalent to:

$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});


Sephi-Chan
J'utilisais de l'XML en sortie AJAX jusqu'à y a quelques semaines, j'ai décidé de passer entièrement au JSon (ça faisait un p'tit temps que je comptais changer).

J'ai une fonction d'interprétation de l'objet qui me permet de manipuler le dom directement. Comme ton "mode", mais en plus complexe, avec pas mal d'autres possibilités comme "addClass", "fadeIn", "val", etc.

En gros, chaque attribut ayant un correspondant JQuery est exécuté avec quelques trucs en plus évidemment. C'est vraiment pratique du coup parce qu'on gère 99% de la sortie au niveau du serveur.
Les seules exceptions (le petit pourcentage restant) sont les manipulations plus compliquées ^^.

Voici un exemple typique :
<?php
$aAjax[] = array('sel' => '#place', 'val' => 'Modifier');
$aAjax[] = array('sel' => '#delplace', 'removeClass' => 'hidden');
$aAjax[] = array(
'sel' => '#l-59-30',
'src' => './ress/img/decor/2.gif',
'class' => 'place32',
'after' => '<img src="./ress/img/vide.gif" />'
);
?>

J’aplatis tout ça en sortie avec json_encode() et je le récupère en javascript avec une fonction générique qui analyse l'objet de sortie.
Merci pour les réponses et surtout celle d'Holy car le fonctionnement que je recherche semble extrêmement proche du sien.

Il ne me reste plus qu'à itérer sur les données envoyées pour les traiter et switcher le retour selon le format fourni (XML ou JSON); pour l'instant, je vais garder la possibilité de travailler en XML en plus du JSON.