Gibt es eine Begrenzung, wie viel JSON halten kann?

163

Ich verwende jquery, JSON und AJAX für ein Kommentarsystem. Ich bin neugierig, gibt es eine Größenbeschränkung für das, was Sie mit JSON senden / speichern können? Wenn ein Benutzer eine große Menge eingibt und ich sie über JSON sende, gibt es eine maximale Grenze?

Es kann auch jede Art von Text über JSON gesendet werden. Zum Beispiel erlaube ich Benutzern manchmal, HTML zu verwenden. Ist das in Ordnung?

JasonDavis
quelle
9
Seien Sie vorsichtig, wie Sie die Antworten der Leute unten interpretieren! Die meisten Antworten sagen, dass es für 'JSON' selbst keine Grenzen gibt. Während die meisten Server ein konfigurierbares Limit haben. Ich habe einen einfachen AJAX-Test ausgeführt, bei dem ich bei jedem Senden ein Byte inkrementiert habe und bei ca. 8 KByte auf mehreren PHP / Apache-Servern, die ich jetzt ausprobiert habe, ein Fehler aufgetreten ist. Fehler war: "414 (Request-URI Too Large)"
Jeach
3
Wir senden / empfangen zuverlässig 100 KB Nutzdaten auf iOS / iPhone. Beachten Sie, dass viele Protokolle Daten in Blöcken empfangen. Der Versuch, den Block zu deserialisieren, anstatt auf den Empfang aller Daten zu warten, führt zu einem Fehler, es sei denn, Ihre Deserialisierungslogik ist speziell dafür eingerichtet.
Hot Licks
1
@Jeach - Dieser Fehler war mit ziemlicher Sicherheit darauf zurückzuführen, dass die Datenübertragung in 8-KByte-Blöcke aufgeteilt und am anderen Ende vor dem Parsen nicht ordnungsgemäß wieder zusammengesetzt wurde.
Hot Licks
1
@Jeach - Dies ist ein häufiger Codierungsfehler. Warten Sie nur auf die erste Antwortnachricht einer Anfrage, während Sie auf die letzte warten und die Antwortdaten miteinander verknüpfen. Jede Antwort enthält höchstens 8 KB, sodass für längere Daten mehrere Antworten verwendet werden.
Hot Licks
1
@Jeach - Wenn Sie dies in iOS mit einer Standard-NSURLConnectionh tun, müssen connectionDidFinishLoadingSie die JSON-Übersetzung dort implementieren (oder danach aufrufen ) und nicht in didReceiveData(wo Sie die empfangenen Daten einfach mit dem vorherigen Datum verketten sollten) empfangen). Andere Umgebungen sind ähnlich.
Hot Licks

Antworten:

141

JSON ähnelt anderen Datenformaten wie XML. Wenn Sie mehr Daten übertragen müssen, senden Sie einfach mehr Daten. Es gibt keine inhärente Größenbeschränkung für die JSON-Anforderung. Jede Einschränkung wird vom Server festgelegt, der die Anforderung analysiert. (Beispielsweise verfügt ASP.NET über die Eigenschaft "MaxJsonLength" des Serializers.)

Bernstein
quelle
1
Wenn ich also den GANZEN Quellcode auf diese ganze Seite übertragen wollte, könnte er als JSON-Objekt gesendet werden?
JasonDavis
Der Code dieser Seite ist tatsächlich nur 6,7 KB groß (ohne externe Ressourcen). Dies ist mit nahezu jeder Art von HTTP-Anforderung problemlos möglich.
Amber
15
Es kann erwähnenswert sein, dass der "Standardwert 2097152 Zeichen ist, was 4 MB Unicode-Zeichenfolgendaten entspricht" für die JavaScriptSerializer.MaxJsonLengthin Bernsteins Antwort erwähnte Eigenschaft . (NB ich habe aus MSDN zitiert )
Dumbledad
Wie würde ich ein 155-KB-JSON-Objekt analysieren?
Ray
2
@AsadHasan Ein Server kann je nach Richtung der Daten analysieren oder serialisieren.
Amber
18

Es gibt keine feste Grenze für die Größe eines JSON-Datenblocks oder eines der Felder.

Es gibt Grenzen, wie viel JSON die JavaScript-Implementierung verschiedener Browser verarbeiten kann (z. B. nach meiner Erfahrung etwa 40 MB). Siehe diese Frage zum Beispiel .

cdiggins
quelle
4
8K ist eine außergewöhnlich kleine Grenze für JSON. Ich vermute, dass dies keine Begrenzung für den JSON ist, sondern dass die Daten in 8K-Blöcken übertragen werden und der Code, der die Daten empfängt, versucht, einen einzelnen Block zu deserialisieren, anstatt auf das Eintreffen der gesamten Nutzlast zu warten.
Hot Licks
Ich wette, Sie sind richtig Hot Licks. Ich habe meine Antwort aktualisiert.
Cdiggins
9

Dies hängt von der Implementierung Ihres JSON-Writers / Parsers ab. Der DataContractJsonSerializer von Microsoft scheint ein hartes Limit von 8 KB (8192, glaube ich) zu haben, und bei größeren Zeichenfolgen tritt ein Fehler auf.

Bearbeiten: Wir konnten das 8K-Limit für JSON-Zeichenfolgen auflösen, indem wir die MaxJsonLength-Eigenschaft in der Webkonfiguration wie in dieser Antwort beschrieben festlegen: https://stackoverflow.com/a/1151993/61569

Anthony F.
quelle
5
Ein 8K "Limit" ist mit ziemlicher Sicherheit eine Datenübertragungsblockgrenze, nicht das Limit für ein JSON-Dokument. Größere Zeichenfolgen können verarbeitet werden, indem die Mehrblockübertragung korrekt wieder zusammengesetzt wird.
Hot Licks
Es ist schon eine Weile her, dass wir herausgefunden haben, wie das 8K-Limit im DataContractJsonSerializer geändert werden kann , aber ich denke, es war die Einstellung "MaxJsonLength" ( msdn.microsoft.com/en-us/library/… )
Anthony F
5

Die Größe der zu sendenden oder zu empfangenden JSON-Daten ist wirklich unbegrenzt. Wir können auch Json-Daten in einer Datei senden. Je nach den Funktionen des Browsers, mit dem Sie arbeiten, können Json-Daten verarbeitet werden.

Chaitanya Belsare
quelle
5

Bei Implementierungen können Sie Beschränkungen für JSON-Dokumente festlegen, einschließlich der Größe. Wählen Sie Ihren Parser daher mit Bedacht aus. Siehe RFC 7159 , Abschnitt 9. Parser:

"Eine Implementierung kann Grenzen für die Größe der von ihr akzeptierten Texte festlegen. Eine Implementierung kann Grenzen für die maximale Verschachtelungstiefe festlegen. Eine Implementierung kann Grenzen für den Bereich und die Genauigkeit von Zahlen festlegen. Eine Implementierung kann Grenzen für die Länge und das Zeichen festlegen Inhalt von Zeichenfolgen. "

stleary
quelle
3

Wenn Sie mit ASP.NET MVC arbeiten, können Sie das Problem lösen, indem Sie Ihrem Ergebnis die MaxJsonLength hinzufügen :

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
mathias.horn
quelle
Aber das macht das Maximum ungefähr 4 MB, und wir brauchen es höher. Wie könnten wir mit diesem Szenario umgehen?
Casey
@Casey - Welches Symptom tritt bei Ihnen über 4 MB hinaus auf? Die vorzeichenbehaftete 32-Bit-Ganzzahl steigt auf 2 Milliarden - an anderer Stelle muss Ihre Größe begrenzt sein. Der Standardwert von MaxJsonLength ist 2 MB Unicode-Zeichen, also 4 MB. Der obige Code erhöht MaxJsonLength auf einen viel größeren Wert. Vielleicht int.MaxValuewird es als "zu groß" abgelehnt - probieren Sie andere Größen aus und sehen Sie, wie groß Sie werden können.
ToolmakerSteve
Weißt du was, du bist richtig. Ich habe wahrscheinlich eine Flase-Fehler-Blase oder es wird die Einstellung nicht verwendet. Ich versuche diesen Pre-Controller zu machen, nicht das Ergebnis. Wenn ich versuche, ein Json-Objekt, das groß ist, an den Controller-Aufruf zu senden, wenn ich die Entwicklertools verwende und debugge, gibt die Anforderungsserverseite zurück, dass die Größe das Json-Limit überschreitet.
Casey
Dies ist mein Problem, wie ich dies auf der Microsoft-Website umgehen kann. "Grundsätzlich berücksichtigt der" interne "JavaScriptSerializer den Wert von maxJsonLength, wenn er von einer Webmethode aufgerufen wird. Die direkte Verwendung eines JavaScriptSerializers (oder die Verwendung über eine MVC-Aktionsmethode / einen Controller) berücksichtigt die Eigenschaft maxJsonLength nicht, zumindest nicht von systemWebExtensions Abschnitt .scripting.webServices.jsonSerialization, den Sie in der Datei web.config definieren. "
Casey
Ich frage mich fast, ob ich sagen könnte, etwas über 50.000 in Blöcke wie List <type string> zu zerlegen, das dann an den Controller zu senden, einen String bulder zu erstellen und dann in SQL zu importieren.
Casey
2

Sicherlich hat hier jeder einen Trick verpasst. Die aktuelle Dateigrößenbeschränkung einer JSON-Datei beträgt 18.446.744.073.709.551.616 Zeichen oder wenn Sie Bytes bevorzugen, oder sogar 2 ^ 64 Bytes, wenn Sie mindestens 64-Bit-Infrastrukturen betrachten.

In jeder Hinsicht können wir davon ausgehen, dass es unbegrenzt ist, da es Ihnen wahrscheinlich schwer fallen wird, dieses Problem zu lösen ...

Perfect64
quelle
-7

Die maximale Länge von JSON-Zeichenfolgen. Der Standardwert beträgt 2097152 Zeichen, was 4 MB Unicode-Zeichenfolgendaten entspricht.

Siehe unten stehende URL

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

Shashi Keshar
quelle
2
JSON selbst hat keine inhärente Grenze. Was Sie gepostet haben, ist spezifisch für .net und seine JavaScriptSerializerKlasse. Und MaxJsonLengthwurde bereits in anderen Antworten angesprochen.
David Makogon
Kann jemand posten, wie man größer als der .NET JavaScriptSerializer umgeht? Wie kann ich beispielsweise einen großen JSON an den MVC-Controller senden, aber den Serializer von Newtonsoft verwenden, um damit umzugehen, oder ist dies nicht möglich, da er in .NET integriert ist und der verwendete Pre-Controller getroffen wird?
Casey