OVH Cloud OVH Cloud

JQuery --> getJSON() - Taille maximum du JSON ?

25 réponses
Avatar
Groquik
Hello !

Je viens de constater un problème plutôt embarrassant :
J'utilise la méthode getJSON() de JQuery, qui fonctionne bien... sauf
quand le JSON retourné est trop gros !

En effet, dès que les données retournées atteignent un certain nombre de
Ko, je vois correctement la réponse dans Firebug (en-tête "Réponse"),
correctement formaté en JSON, mais ma fonction de callback n'est pas
appelée :-(

En revanche, tout se passe à merveille quand la réponse est plus petite.
J'ai cherché mon problème sur plein de forums, mais sans trouver mon
problème.

Quelqu'un peut-il m'apporter ses lumières ?

Merci par avance ;-)
@++

Groquik

10 réponses

1 2 3
Avatar
Cenekemoi
"Olivier Miakinen" <om+ a écrit dans le message de
news:
En gros, la norme dit ceci :

1) tab1["machin"] = "truc" crée une propriété de nom "machin" et de
valeur "truc" et c'est tout.
2) tab1[1000] = "truc" crée une propriété de nom "1000" et de valeur
"truc", *et* passe la valeur de la propriété "length" à 1001 (sauf
bien
sûr si elle était déjà supérieure à 1000).
3) tab1["length"] = 10 efface toutes les propriétés dont la valeur
numérique est supérieure ou égale à 10 et inférieure à la propriété
"length", puis passe la valeur de la propriété "length" à 10.

Nulle part il n'est question de créer 999 éléments nuls quand tu
ajoutes l'élément indexé par 1000 ! Et donc, pour calculer le nombre
réel d'éléments de tab1, tu dois faire comme pour tab2 : une boucle
« for (var prop in tab1) ».



Toutefois, si j'écris:

tab = [ ];
tab[10] = true;
alert(tab);

j'obtiens:

[,,,,,,,,,true]

...donc je ne sais pas trop qu'en penser !

Note au passage que tab1[1000] ou tab1["1000"] crée exactement la même
propriété, dont le nom est "1000" et non pas 1000.



Oui, du coup on peut écrire:

tab1 = [ 1,2 ];
tab2 = [ ];
tab2[ tab1] = true;

cela fonctionne correctement.

Mais :

for (var prop in tab2) {
alert( typeof(prop) +'_'+ prop );
}

va afficher : String_[1,2]

Ainsi, la propriété a perdu son été de "Array"...

--
Cordialement, Thierry ;-)
Avatar
Olivier Miakinen
Le 25/03/2010 03:32, SAM a écrit :

[...]



ben ... un exemple de Json tu en as un ici :
<4ba1f172$0$2874$
en gros : un objet d'objets d'objets et d'arrays
(le plus souvent (toujours ?) servi sous forme d'un string
que des fonctions Json (en JS) traduisent à grd' renfort d'eval)



Ok, je comprends, ou du moins je le suppose.

On voit dans cet exemple qu'il y a xxx modèles (de voitures)
avec xx options chacun
que pour chaque modèle (propriété de l'objet général)
les xx options (propriétés du modèle) sont énumérées même quand elles
n'existent pas
que certaines options sont elles-mêmes des arrays
Le truc re-développé fait dans les 800-900 lignes (1 prop par ligne)



Je n'arrive pas à voir ici d'exemple de tableau avec des index non
renseignés. En fait, ce qu'il faudrait, c'est voir si un tableau ne
contenant qu'une entrée numérotée 2, se retrouve après sérialisation
puis désérialisation avoir trois entrées numérotées 0, 1 et 2.

[...]

le pb de l'OP fut des erreurs de quotage dans les valeurs des prop qui
sont des strings (on n'sait plus où on en est des ' " ' ")
une kkdouille côté serveur quoi.



Oui, ça j'ai vu.

Voyons ce que dit la norme.

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf
[...]

En gros, cela dit ceci :

1) tab1["machin"] = "truc" crée une propriété de nom "machin" et de
valeur "truc" et c'est tout.
2) tab1[1000] = "truc" crée une propriété de nom "1000" et de valeur
"truc", *et* passe la valeur de la propriété "length" à 1001 (sauf bien
sûr si elle était déjà supérieure à 1000).
3) tab1["length"] = 10 efface toutes les propriétés dont la valeur
numérique est supérieure ou égale à 10 et inférieure à la propriété
"length", puis passe la valeur de la propriété "length" à 10.



Là, au (3), même en fr j'ai rien compris !



Voici un petit exemple testé sur http://writecodeonline.com/javascript/

---------------------------------------------------
function prtab(tab1)
{
document.writeln('length='+tab1.length);
document.writeln('<br>');
document.writeln(tab1);
document.writeln('<br>');
for (var prop in tab1) {
document.writeln('tab1['+prop+']='+tab1[prop]);
}
document.writeln('<br><br>');
}

tab1=new Array('a','b','c','d','e');
tab1['test']='x';
tab1['10']='k';
prtab(tab1);

tab1['length']=4;
prtab(tab1);

tab1.length;
prtab(tab1);

tab1['length']P;
prtab(tab1);

tab1['length']=0;
prtab(tab1);
---------------------------------------------------

Résultat :

---------------------------------------------------
length
a,b,c,d,e,,,,,,k
tab1[0]=a tab1[1]=b tab1[2]=c tab1[3]=d tab1[4]=e tab1[test]=x tab1[10]=k

length=4
a,b,c,d
tab1[0]=a tab1[1]=b tab1[2]=c tab1[3]=d tab1[test]=x

length
a,b,c,d,,,,,,,
tab1[0]=a tab1[1]=b tab1[2]=c tab1[3]=d tab1[test]=x

lengthP
a,b,c,d,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
tab1[0]=a tab1[1]=b tab1[2]=c tab1[3]=d tab1[test]=x

length=0

tab1[test]=x
---------------------------------------------------

On voit que diminuer tab1.length (ou tab1['length'] ce qui revient au
même) efface réellement les propriétés dont le nom est un nombre plus
petit que le nouveau tab1.length, mais ça ne touche pas aux propriétés
dont le nom n'est pas un nombre.

De plus, d'après la norme, si on avait un tab1["30"] alors que
tab1.length vaut 20, alors passer tab1.length à 10 ne devrait *pas*
effacer tab1["30"]. Mais je ne sais pas comment obtenir une telle situation.

Note au passage que tab1[1000] ou tab1["1000"] crée exactement la même
propriété, dont le nom est "1000" et non pas 1000.



donc
if(tab1.1000 == 'truc') alert('Banco !');
oui ?



Sauf que cette syntaxe n'est pas autorisée avec un nom de propriété qui
commence par un chiffre...

--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 25/03/2010 09:16, Cenekemoi a écrit :

[...]



Toutefois, si j'écris:

tab = [ ];
tab[10] = true;
alert(tab);

j'obtiens:

[,,,,,,,,,true]



Oui. Cela ne veut pas dire qu'il y a 11 éléments dans tab, mais juste
que la fonction d'affichage fait une boucle pour tout entier entre 0 et
length ! De même, si tu fais tab.length0, ça ne va pas te rajouter
plusieurs dizaines d'éléments dans tab, mais tu auras plusieurs dizaines
de virgules en plus dans alert(tab).

Note au passage que tab1[1000] ou tab1["1000"] crée exactement la même
propriété, dont le nom est "1000" et non pas 1000.



Oui, du coup on peut écrire:

tab1 = [ 1,2 ];
tab2 = [ ];
tab2[ tab1] = true;

cela fonctionne correctement.

Mais :

for (var prop in tab2) {
alert( typeof(prop) +'_'+ prop );
}

va afficher : String_[1,2]

Ainsi, la propriété a perdu son été de "Array"...



En effet. De même qu'un index entier est transformé en string, il en va
de même pour tout type d'index (je suppose qu'on peut essayer aussi avec
null, avec undefined, avec true ou false, et ainsi de suite).

--
Olivier Miakinen
Avatar
SAM
Le 3/26/10 1:10 AM, Olivier Miakinen a écrit :
Le 25/03/2010 03:32, SAM a écrit :
[...]


ben ... un exemple de Json tu en as un ici :
<4ba1f172$0$2874$
en gros : un objet d'objets d'objets et d'arrays
(le plus souvent (toujours ?) servi sous forme d'un string
que des fonctions Json (en JS) traduisent à grd' renfort d'eval)



Ok, je comprends, ou du moins je le suppose.



Ha! Ben! c'est expliqué dans ma langue, hein ?

Je crois que ça va te plaire :
<http://www.json.org/jsonfr.html>
Et après le casse-tête, plus simple :
<http://fr.wikipedia.org/wiki/JavaScript_Object_Notation>
où on nous dit que Json kifkif xml


que pour chaque modèle (propriété de l'objet général)
les xx options (propriétés du modèle) sont énumérées même quand elles
n'existent pas
que certaines options sont elles-mêmes des arrays
Le truc re-développé fait dans les 800-900 lignes (1 prop par ligne)



Je n'arrive pas à voir ici d'exemple de tableau avec des index non
renseignés.



Non en effet puisque ce ne sont que des propriétés de propriétés
La discussion a dérapé ensuite vers les tableaux.

En fait, ce qu'il faudrait, c'est voir si un tableau ne
contenant qu'une entrée numérotée 2, se retrouve après sérialisation
puis désérialisation avoir trois entrées numérotées 0, 1 et 2.

[...]

Là, au (3), même en fr j'ai rien compris !



Voici un petit exemple testé sur http://writecodeonline.com/javascript/



où tous les éléments du tableau sont des strings

On voit que diminuer tab1.length (ou tab1['length'] ce qui revient au
même) efface réellement les propriétés dont le nom est un nombre plus
petit que le nouveau tab1.length, mais ça ne touche pas aux propriétés
dont le nom n'est pas un nombre.



Je crois que j'ai un pb de vocabulaire :-(
c'est quoi 'nom' 'nombre' et 'propriété' ?

Un élément de tableau est une propriété ?
Le nom de l'élément est son index ?

Pour moi, faire tab['test'] = x;
c'est équivalent à faire tab.test = x;
ça sort complètement du tableau tab,
on lui ajoute jute une propriété en annexe.
Je pourrai l'allonger, le rétrécir, par tab.length autant que je veux
que tab.test sera toujours là et de valeur x.

Cette norme qui nous dit que les index sont des noms de propriété
ça me tue !

--
sm
Avatar
Bol
Bonjour

Toutefois, si j'écris:

tab = [ ];
tab[10] = true;
alert(tab);

j'obtiens:

[,,,,,,,,,true]



Oui. Cela ne veut pas dire qu'il y a 11 éléments dans tab, mais juste
que la fonction d'affichage fait une boucle pour tout entier entre 0 et
length ! De même, si tu fais tab.length0, ça ne va pas te rajouter



Exemple rapide, Firefox, console, code :
var s="", a=new Array();a[1000];for(var v in a)
s+=v+"="+a[v]+",";alert(s);
ou
var s="", a=[];a[1000];for(var v in a) s+=v+"="+a[v]+",";alert(s);

donne
1000,

A+
Bol
Avatar
Olivier Miakinen
Le 26/03/2010 04:18, SAM a écrit :

Je crois que ça va te plaire :
<http://www.json.org/jsonfr.html>



:-D

[...]

Voici un petit exemple testé sur http://writecodeonline.com/javascript/



où tous les éléments du tableau sont des strings



Oui, peu importe le type des éléments puisque ce qui m'intéressait ici
c'étaient les index. Je voulais montrer qu'un tableau en JavaScript
n'est qu'un objet comme un autre, avec une liste de propriétés, aussi
bien pour un tableau associatif que pour un tableau (que l'on croit)
indexé par des entiers.

On voit que diminuer tab1.length (ou tab1['length'] ce qui revient au
même) efface réellement les propriétés dont le nom est un nombre plus
petit que le nouveau tab1.length, mais ça ne touche pas aux propriétés
dont le nom n'est pas un nombre.



Je crois que j'ai un pb de vocabulaire :-(
c'est quoi 'nom' 'nombre' et 'propriété' ?



Le nom d'une propriété, c'est par exemple "length" pour la propriété
tab1.length qui s'écrit aussi bien tab1["length"]. Mais cela peut être
"10" pour la propriété tab1[10] qui s'écrit aussi bien tab1["10"].

En gros, je crois qu'un nom de propriété V est traité comme un nombre
pour un tableau si ToString(ToUint32(V)) redonne V.

Un élément de tableau est une propriété ?
Le nom de l'élément est son index ?

Pour moi, faire tab['test'] = x;
c'est équivalent à faire tab.test = x;



Oui à tout.

ça sort complètement du tableau tab,
on lui ajoute jute une propriété en annexe.



Tout est fait pour qu'on ait cette impression, oui. En réalité, tab[1],
tab['2'] et tab['test'] sont stockés de façon parfaitement similaire
(noms de propriété respectifs '1', '2' et 'test'). La seule différence
est que, puisque ToString(ToUint32('1')) donne '1' (et idem pour '2'),
il y a un traitement supplémentaire qui est fait sur tab['length']. Et
réciproquement, si on change tab['length'], cela peut éventuellement
détruire certaines autres propriétés.

Je pourrai l'allonger, le rétrécir, par tab.length autant que je veux
que tab.test sera toujours là et de valeur x.



Oui, et il en ira de même pour tab[-10], tab[3.5] et tab[5000000000].

Cette norme qui nous dit que les index sont des noms de propriété
ça me tue !



Il y a beaucoup de choses contraires à l'intuition dans JavaScript !


Tiens, un autre test dans <http://writecodeonline.com/javascript/>,
suivi par son résultat :
---------------------------------------------------------------------
function prtab(tab)
{
document.writeln('length='+tab.length);
document.writeln('<br>');
document.writeln(tab);
document.writeln('<br>');
for (var prop in tab) {
document.writeln('tab['+prop+']='+tab[prop]);
}
document.writeln('<br><br>');
}

var tab=[];
tab["x"]="x";
tab[20] ; tab["20"]="x20";
tab["10"]="x10"; tab[10];
tab[-20]=-20; tab["-20"]="x-20";
tab["-10"]="x-10"; tab[-10]=-10;
tab[3.5]=3.5;
tab[5000000000]P00000000;
tab[300]00;
tab["x300"]="x300";
tab[200] 0;
tab["x200"]="x200";
prtab(tab);

tab.length;
prtab(tab);

tab.length=2;
prtab(tab);
---------------------------------------------------------------------
length01
,,,,,,,,,,10,,,,,,,,,,x20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,300
tab[x]=x tab[20]=x20 tab[10] tab[-20]=x-20 tab[-10]=-10 tab[3.5]=3.5
tab[5000000000]P00000000 tab[300]00 tab[x300]=x300 tab[200] 0
tab[x200]=x200

length
,,,,,,,,,,10,,,,
tab[x]=x tab[10] tab[-20]=x-20 tab[-10]=-10 tab[3.5]=3.5
tab[5000000000]P00000000 tab[x300]=x300 tab[x200]=x200

length=2
,
tab[x]=x tab[-20]=x-20 tab[-10]=-10 tab[3.5]=3.5
tab[5000000000]P00000000 tab[x300]=x300 tab[x200]=x200
---------------------------------------------------------------------

On y voit que :
1) tab[10] désigne la même chose que tab["10"], idem avec tab[-10] ;
2) positionner tab[300] passe tab.length à 301, mais tab[5000000000]
ne change pas tab.length (5000000000 est plus grand que 2^32) ;
3) passer tab.length à 15 supprime tab[200] et tab[300] mais pas
tab[-10] ni tab[5000000000] ;
4) de même, passer tab.length à 2 ne supprime pas tab[3.5].
Avatar
Olivier Miakinen
Le 26/03/2010 13:14, j'écrivais :


[...]
---------------------------------------------------------------------
length01
,,,,,,,,,,10,,,,,,,,,,x20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,300
tab[x]=x tab[20]=x20 tab[10] tab[-20]=x-20 tab[-10]=-10 tab[3.5]=3.5
tab[5000000000]P00000000 tab[300]00 tab[x300]=x300 tab[200] 0
tab[x200]=x200

[...]
---------------------------------------------------------------------

On y voit que :
1) tab[10] désigne la même chose que tab["10"], idem avec tab[-10] ;
2) positionner tab[300] passe tab.length à 301, mais tab[5000000000]
ne change pas tab.length (5000000000 est plus grand que 2^32) ;
3) passer tab.length à 15 supprime tab[200] et tab[300] mais pas
tab[-10] ni tab[5000000000] ;
4) de même, passer tab.length à 2 ne supprime pas tab[3.5].



On y voit aussi que les entrées indexées par des nombres ne sont pas
forcément ordonnées par index croissant puisque on retrouve dans cet
ordre : tab[20], tab[10], tab[300] et tab[200].
Avatar
Olivier Miakinen
Le 26/03/2010 11:13, Bol a écrit :

Exemple rapide, Firefox, console, code :



Où trouves-tu ça dans Firefox ? C'est une extension ?

var s="", a=new Array();a[1000];for(var v in a)
s+=v+"="+a[v]+",";alert(s);
ou
var s="", a=[];a[1000];for(var v in a) s+=v+"="+a[v]+",";alert(s);

donne
1000,



Oui.
Avatar
Bol
Exemple rapide, Firefox, console, code :



Où trouves-tu ça dans Firefox ? C'est une extension ?



Outils, console d'erreur Ctrl+Maj+J

A+
Bol
Avatar
Olivier Miakinen
Le 26/03/2010 13:59, Bol a écrit :

Où trouves-tu ça dans Firefox ? C'est une extension ?



Outils, console d'erreur Ctrl+Maj+J



Vu. Merci !
1 2 3