Y a-t-il une limite à la quantité de JSON pouvant contenir?

163

J'utilise jquery, JSON et AJAX pour un système de commentaires. Je suis curieux, y a-t-il une limite de taille sur ce que vous pouvez envoyer / stocker avec JSON? Comme si un utilisateur tape une grande quantité et que je l'envoie via JSON, y a-t-il une sorte de limite maximale?

Tout type de texte peut également être envoyé via JSON. par exemple, parfois, j'autorise les utilisateurs à utiliser html, est-ce que ça va?

JasonDavis
la source
9
Faites attention à la façon dont vous interprétez les réponses des gens ci-dessous! La plupart des réponses disent qu'il n'y a pas de limites à «JSON» lui-même. Alors que la plupart des serveurs auront une limite configurable. J'ai exécuté un simple test AJAX où j'ai incrémenté un octet à chaque envoi et à environ 8K octets, il a échoué sur plusieurs serveurs PHP / Apache que j'ai essayés maintenant. L'erreur était: «414 (Request-URI Too Large)»
Jeach
3
Nous envoyons / recevons de manière fiable des charges utiles de 100 Ko sur iOS / iPhone. Il faut se méfier du fait que de nombreux protocoles reçoivent des données par blocs, et tenter de désérialiser le bloc plutôt que d'attendre que toutes les données soient reçues entraînera un échec, à moins que votre logique de désérialisation ne soit spécialement configurée pour cela.
Hot Licks
1
@Jeach - Cet échec était presque certainement dû au fait que la transmission de données était divisée en blocs de 8K, puis n'était pas correctement réassemblée à l'autre extrémité avant d'essayer d'analyser.
Hot Licks
1
@Jeach - Il s'agit d'une erreur de codage courante. Attendre uniquement le premier message de réponse d'une demande vs attendre le dernier et concaténer les données de réponse ensemble. Chaque réponse contiendra au plus 8K, donc pour des données plus longues, plusieurs réponses sont utilisées.
Hot Licks
1
@Jeach - Si vous faites cela dans iOS, avec une NSURLConnectionh standard, vous devez implémenter connectionDidFinishLoadinget faire la traduction JSON là (ou après cela est appelé), pas dans didReceiveData(où vous devez simplement concaténer les données reçues avec la date précédente reçu). D'autres environnements sont similaires.
Hot Licks

Réponses:

141

JSON est similaire à d'autres formats de données comme XML - si vous avez besoin de transmettre plus de données, il vous suffit d'envoyer plus de données. Il n'y a pas de limitation de taille inhérente à la requête JSON. Toute limitation serait définie par le serveur analysant la demande. (Par exemple, ASP.NET a la propriété "MaxJsonLength" du sérialiseur.)

ambre
la source
1
si techniquement, si je voulais prendre le code source ENTIER sur cette page entière, il pourrait être envoyé en tant qu'objet json?
JasonDavis
Le code de cette page n'est en fait que de 6,7 ko (sans compter les ressources externes). Cela se ferait facilement avec à peu près n'importe quel type de requête HTTP.
Amber
15
Il peut être intéressant de noter que "la valeur par défaut est de 2097152 caractères, ce qui équivaut à 4 Mo de données de chaîne Unicode" pour la propriété JavaScriptSerializer.MaxJsonLengthmentionnée dans la réponse d'Amber. (NB j'ai cité MSDN )
dumbledad
Alors, comment analyser un objet JSON de 155 Ko?
Ray
2
@AsadHasan Un serveur peut analyser ou sérialiser, selon la direction dans laquelle les données vont.
Ambre
18

Il n'y a pas de limite fixe sur la taille d'un bloc de données JSON ou de l'un des champs.

Il y a des limites à la quantité de JSON que l'implémentation JavaScript de divers navigateurs peut gérer (par exemple environ 40 Mo selon mon expérience). Voir cette question par exemple .

cdiggins
la source
4
8K est une limite exceptionnellement petite pour JSON. Je soupçonne que ce n'est pas une limite pour le JSON, mais plutôt que les données sont transmises dans des blocs de 8K, et le code recevant les données tente de désérialiser un bloc individuel plutôt que d'attendre que toute la charge utile arrive.
Hot Licks
Je parie que vous avez raison Hot Licks. J'ai mis à jour ma réponse.
cdiggins
9

Cela dépend de l'implémentation de votre écrivain / analyseur JSON. DataContractJsonSerializer de Microsoft semble avoir une limite stricte autour de 8 ko (8192 je pense), et il se produira une erreur pour les chaînes plus grandes.

Edit: Nous avons pu résoudre la limite de 8K pour les chaînes JSON en définissant la propriété MaxJsonLength dans la configuration Web comme décrit dans cette réponse: https://stackoverflow.com/a/1151993/61569

Anthony F
la source
5
Une "limite" de 8K est presque certainement une limite de bloc de transmission de données, pas la limite pour un document JSON. Les chaînes plus grandes peuvent être traitées en réassemblant correctement la transmission multi-blocs.
Hot Licks
Cela fait un moment que nous n'avons pas trouvé comment changer la limite de 8K dans DataContractJsonSerializer, mais je pense que c'était le paramètre "MaxJsonLength" ( msdn.microsoft.com/en-us/library/… )
Anthony F
5

Il n'y a vraiment aucune limite sur la taille des données JSON à envoyer ou à recevoir. Nous pouvons également envoyer des données Json dans un fichier. Selon les capacités du navigateur avec lequel vous travaillez, les données Json peuvent être gérées.

Chaitanya Belsare
la source
5

Les implémentations sont libres de définir des limites sur les documents JSON, y compris la taille, alors choisissez votre analyseur judicieusement. Voir RFC 7159 , Section 9. Analyseurs:

"Une mise en œuvre peut fixer des limites sur la taille des textes qu'elle accepte. Une mise en œuvre peut fixer des limites sur la profondeur maximale d'imbrication. Une mise en œuvre peut fixer des limites sur la plage et la précision des nombres. Une mise en œuvre peut fixer des limites sur la longueur et le caractère contenu des chaînes. "

stleary
la source
3

Si vous travaillez avec ASP.NET MVC, vous pouvez résoudre le problème en ajoutant MaxJsonLength à votre résultat:

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
mathias.horn
la source
Mais cela rend le maximum d'environ 4 Mo, et nous en avons besoin plus haut. Comment pourrions-nous gérer ce scénario?
Casey
@Casey - quel symptôme vous arrive au-delà de 4 Mo? l'entier 32 bits signé va jusqu'à 2 milliards - il doit y avoir quelque chose ailleurs limitant votre taille. La valeur par défaut de MaxJsonLength est de 2 Mo de caractères Unicode, donc 4 Mo. Le code ci-dessus augmente MaxJsonLength à une valeur beaucoup plus grande. Peut int.MaxValue- être est rejeté comme "trop ​​grand" - essayez d'autres tailles et voyez quelle taille vous pouvez obtenir.
ToolmakerSteve
Vous savez quoi, vous avez raison. Je reçois probablement une bulle d'erreur de flase, ou il n'utilise pas le réglage. J'essaye de faire ce pré-contrôleur, pas sur le résultat. Lorsque j'essaie d'envoyer un objet Json de grande taille à l'appel du contrôleur, si j'utilise les outils de développement et que je débogue, le côté serveur de demande renvoie la taille dépasse la limite Json.
Casey
C'est mon problème, comment contourner cela par le site Web de Microsoft. "Fondamentalement, le JavaScriptSerializer" interne "respecte la valeur de maxJsonLength lorsqu'il est appelé à partir d'une méthode Web. L'utilisation directe d'un JavaScriptSerializer (ou une utilisation via une méthode d'action / un contrôleur MVC) ne respecte pas la propriété maxJsonLength, du moins pas depuis systemWebExtensions .scripting.webServices.jsonSerialization section que vous définissez dans le fichier web.config. "
Casey
Je me demande presque si je pourrais dire, casser tout ce qui dépasse 50k en morceaux comme List <type string>, puis l'envoyer au contrôleur, et faire un bulder de chaîne, puis importer dans SQL.
Casey
2

Tout le monde a sûrement raté un truc ici. La limite de taille de fichier actuelle d'un fichier json est de 18 446 744 073 709 551 616 caractères ou si vous préférez octets, voire 2 ^ 64 octets si vous regardez au moins des infrastructures 64 bits.

À toutes fins utiles, nous pouvons supposer que c'est illimité, car vous aurez probablement du mal à résoudre ce problème ...

Parfait64
la source
-6

La longueur maximale des chaînes JSON. La valeur par défaut est 2097152 caractères, ce qui équivaut à 4 Mo de données de chaîne Unicode.

Reportez-vous ci-dessous URL

https://docs.microsoft.com/en-us/dotnet/api/system.web.script.serialization.javascriptserializer.maxjsonlength?view=netframework-4.7.2

Shashi Keshar
la source
2
JSON lui-même n'a pas de limite inhérente. Ce que vous avez publié est spécifique à .net et à sa JavaScriptSerializerclasse. Et MaxJsonLengtha déjà été abordé dans d'autres réponses.
David Makogon
Quelqu'un peut-il publier comment gérer plus gros que le JavaScriptSerializer .NET? Par exemple, comment puis-je envoyer un grand json au contrôleur MVC mais utiliser le sérialiseur de Newtonsoft pour le gérer ou est-ce impossible car il est intégré à .NET et utilisé le pré-contrôleur en cours de frappe?
Casey