2011-08-09 2 views
3

J'ai une servlet qui parle avec la base de données puis retourne une liste d'objets ordonnés (ORDER BY time). Dans la partie servlet, j'aiCommandé JSONObject

 
       //access DB, returns a list of User objects, ordered 
     ArrayList users = MySQLDatabaseManager.selectUsers(); 
       //construct response 
     JSONObject jsonResponse = new JSONObject(); 
     int key = 0; 
     for(User user:users){ 
      log("Retrieve User " + user.toString()); 
      JSONObject jsonObj = new JSONObject(); 
      jsonObj.put("name", user.getName()); 
      jsonObj.put("time", user.getTime()); 
      jsonResponse.put(key, jsonObj); 
      key++; 
     } 
       //write out 
     out.print(jsonResponse); 

À partir du journal, je peux voir que la base de données renvoie les objets Utilisateur dans le bon ordre.

Au bout avant, j'ai

 
success: function(jsonObj){ 
      var json = JSON.parse(jsonObj); 
      var id = 0; 
      $.each(json,function(i,item) {    
       var time = item.time;    
       var name = item.name;    
       id++; 
       $("table#usertable tr:last").after('<tr><td>' + id + '</td><td width="20%">' + time + 
         '</td><td>' + name + 
         '</td></tr>'); 
      }); 

     }, 

Mais l'ordre est changé.

Je l'ai seulement remarqué lorsque la liste renvoyée a une grande taille (plus de 130 utilisateurs).

J'ai essayé de déboguer en utilisant Firebug, l'onglet "réponse" dans Firebug montre que l'ordre de la liste est différent avec le journal dans le servlet.

Ai-je commis une erreur?

EDIT: Exemple

 
{"0":{"time":"2011-07-18 18:14:28","email":"[email protected]","origin":"origin-xxx","source":"xxx","target":"xxx","url":"xxx"}, 
"1":{"time":"2011-07-18 18:29:16","email":"[email protected]","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"}, 
"2": 

,..., 
"143":{"time":"2011-08-09 09:57:27","email":"[email protected]","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"} 

,..., 
"134":{"time":"2011-08-05 06:02:57","email":"[email protected]","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"}} 
+0

Veuillez donner un exemple de ce à quoi ressemble votre objet JSON. Les objets JSON ne sont associés à aucun «ordre» spécifique. Pour ce faire, vous devez utiliser un tableau (lui-même pouvant être stocké dans un objet JSON). – ghayes

+0

Salut ghayes, merci pour vos astuces (les objets JSON n'ont aucun 'ordre' spécifique qui leur est associé). Je m'attendais à ce que les objets retournés aient le même ordre que celui qui a été construit. J'ai examiné de plus près les objets JSON de Firebug et j'ai remarqué que je pouvais utiliser la valeur de la clé pour réorganiser la liste. – user200340

+0

Si vous êtes préoccupé par le tri, j'ai également écrit du JavaScript dans ma réponse pour faire exactement cela. Prendre plaisir! – ghayes

Répondre

13

Comme objets JSON ne sont pas en soi une commande, vous devez utiliser un tableau dans votre objet JSON pour assurer l'ordre. À titre d'exemple (basé sur votre code):

jsonObj = 
      { items: 
      [ { name: "Stack", time: "..." }, 
       { name: "Overflow", time: "..." }, 
       { name: "Rocks", time: "..." }, 
       ... ] }; 

Cette structure s'assurera que vos objets sont insérés dans la bonne séquence.

En vous basant sur le code JSON ci-dessus, vous pouvez placer les objets dans un tableau, puis trier le tableau.

var myArray = []; 
var resultArray; 

for (var j in jsonObj) { 
    myArray.push(j); 
} 

myArray = $.sort(myArray, function(a, b) { return parseInt(a) > parseInt(b); }); 

for (var i = 0; i < myArray.length; i++) { 
    resultArray.push(jsonObj[myArray[i]]); 
} 

//resultArray is now the elements in your jsonObj, properly sorted; 

Mais peut-être est plus compliqué que vous recherchez ..

0

Comme mentionné par ghayes, objets JSON ne sont pas ordonnés. Il existe plusieurs solutions à ce problème.

  1. Vous pouvez utiliser array et le trier pour obtenir la liste ordonnée. Vous pouvez utiliser la bibliothèque gson pour obtenir l'ordre désiré des éléments.

    Je préférerais la deuxième option car elle est facile à utiliser.
-1

Comme JSONObject est commander moins et utilise en interne Hashmap. Une façon de l'utiliser pour télécharger toutes les classes de org.json et utiliser directement votre projet en changeant l'implémentation interne de HashMap en LinkedHashMap dans le fichier JSONObject.java. ci-dessous les fichiers json triés https://github.com/abinash1/Sorted-Json-Object