¿Hay un límite sobre cuánto JSON puede contener?

163

Estoy usando jquery, JSON y AJAX para un sistema de comentarios. Tengo curiosidad, ¿hay un límite de tamaño en lo que puede enviar a través de / almacenar con JSON? Como si un usuario escribe una gran cantidad y lo envío a través de JSON, ¿hay algún tipo de límite máximo?

También se puede enviar cualquier tipo de texto a través de JSON. por ejemplo, en algún momento permito que los usuarios usen html, ¿estará bien?

JasonDavis
fuente
9
¡Tenga cuidado al interpretar las respuestas de las personas a continuación! La mayoría de las respuestas dicen que no hay límites para 'JSON' en sí. Si bien la mayoría de los servidores tendrán un límite configurable. Ejecuté una simple prueba AJAX donde incrementé un byte en cada envío y a aproximadamente 8K bytes, falló en varios servidores PHP / Apache que probé ahora. El error fue: "414 (URI de solicitud demasiado grande)"
Jeach
3
Enviamos / recibimos de manera confiable cargas de 100 kb en iOS / iPhone. Algo a tener en cuenta es que muchos protocolos reciben datos en fragmentos, e intentar deserializar el fragmento en lugar de esperar a que se reciban todos los datos dará como resultado un error, a menos que su lógica de deserializador esté especialmente configurada para ello.
Hot Licks
1
@Jeach: esa falla se debió casi con certeza a que la transmisión de datos se dividió en bloques de 8K y luego no se volvió a ensamblar correctamente en el otro extremo antes de intentar analizar.
Hot Licks
1
@Jeach: este es un error de codificación común. Esperando solo el primer mensaje de respuesta de una solicitud versus esperando el último y concatenando los datos de respuesta juntos. Cada respuesta contendrá como máximo 8K, por lo que para datos más largos se utilizan múltiples respuestas.
Hot Licks
1
@Jeach: si está haciendo esto en iOS, con una NSURLConnectionh estándar, debe implementar connectionDidFinishLoadingy hacer la traducción JSON allí (o después de que se llame), no en didReceiveData(donde simplemente debe concatenar los datos recibidos con la fecha anterior recibido). Otros ambientes son similares.
Hot Licks

Respuestas:

141

JSON es similar a otros formatos de datos como XML: si necesita transmitir más datos, simplemente envíe más datos. No hay limitación de tamaño inherente a la solicitud JSON. Cualquier limitación sería establecida por el servidor analizando la solicitud. (Por ejemplo, ASP.NET tiene la propiedad "MaxJsonLength" del serializador).

Ámbar
fuente
1
técnicamente, si quisiera llevar el código fuente COMPLETO a toda esta página, ¿podría enviarse como un objeto json?
JasonDavis
El código de esta página es en realidad solo 6,7 kb (sin contar los recursos externos). Eso se haría fácilmente con casi cualquier tipo de solicitud HTTP.
Ámbar
15
Vale la pena señalar que el "valor predeterminado es 2097152 caracteres, lo que equivale a 4 MB de datos de cadena Unicode" para la propiedad JavaScriptSerializer.MaxJsonLengthmencionada en la respuesta de Amber. (Nota: he citado de MSDN )
dumbledad
Entonces, ¿cómo analizaría un objeto JSON de 155 kb?
Ray
2
@AsadHasan Un servidor puede analizar o serializar, según en qué dirección se dirijan los datos.
Ámbar
18

No hay un límite fijo en cuanto al tamaño de un bloque de datos JSON o cualquiera de los campos.

Hay límites para la cantidad de JSON que puede manejar la implementación de JavaScript de varios navegadores (por ejemplo, alrededor de 40 MB). Ver esta pregunta por ejemplo .

cdiggins
fuente
44
8K es un límite excepcionalmente pequeño para JSON. Sospecho que ese no es un límite para el JSON, sino que los datos se transmiten en bloques de 8K, y el código que recibe los datos está tratando de deserializar un bloque individual en lugar de esperar a que llegue toda la carga útil.
Hot Licks
Apuesto a que tienes razón Hot Licks. Actualicé mi respuesta.
cdiggins
9

Depende de la implementación de su escritor / analizador JSON. DataContractJsonSerializer de Microsoft parece tener un límite estricto de alrededor de 8 kb (8192, creo), y se producirá un error para cadenas más grandes.

Editar: pudimos resolver el límite de 8K para cadenas JSON configurando la propiedad MaxJsonLength en la configuración web como se describe en esta respuesta: https://stackoverflow.com/a/1151993/61569

Anthony F
fuente
55
Un "límite" de 8K es casi seguro un límite de bloque de transmisión de datos, no el límite para un documento JSON. Se pueden procesar cadenas más grandes al volver a ensamblar correctamente la transmisión de bloques múltiples.
Hot Licks
Ha pasado un tiempo desde que descubrimos cómo cambiar el límite de 8K en el DataContractJsonSerializer, pero creo que fue la configuración "MaxJsonLength" ( msdn.microsoft.com/en-us/library/… )
Anthony F
5

Realmente no hay límite en el tamaño de los datos JSON que se enviarán o recibirán. También podemos enviar datos Json en el archivo. De acuerdo con las capacidades del navegador con el que está trabajando, se pueden manejar los datos de Json.

Chaitanya Belsare
fuente
5

Las implementaciones son gratuitas para establecer límites en los documentos JSON, incluido el tamaño, por lo que debe elegir su analizador de forma inteligente. Ver RFC 7159 , Sección 9. Analizadores:

"Una implementación puede establecer límites en el tamaño de los textos que acepta. Una implementación puede establecer límites en la profundidad máxima de anidamiento. Una implementación puede establecer límites en el rango y la precisión de los números. Una implementación puede establecer límites en la longitud y el carácter contenido de cadenas ".

stleary
fuente
3

Si está trabajando con ASP.NET MVC, puede resolver el problema agregando MaxJsonLength a su resultado:

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
mathias.horn
fuente
Pero esto hace que el máximo sea de aproximadamente 4 MB, y lo necesitamos más alto. ¿Cómo podríamos manejar ese escenario?
Casey el
@Casey: ¿qué síntoma te sucede más allá de 4 MB? un entero de 32 bits con signo sube a 2 mil millones ; debe haber algo en otro lugar que limite su tamaño. El valor predeterminado de MaxJsonLength es 2M caracteres Unicode, entonces 4MB. El código anterior está aumentando MaxJsonLength a un valor mucho mayor . Tal vez int.MaxValuesea ​​rechazado como "demasiado grande": pruebe con otros tamaños y vea qué tan grande puede llegar a ser.
ToolmakerSteve
Sabes qué, estás en lo correcto. Probablemente esté apareciendo una burbuja de error de flase, o no estoy utilizando la configuración. Estoy tratando de hacer este pre controlador, no en el resultado. Cuando intento enviar un objeto Json que es grande para la llamada del controlador, si uso las herramientas de desarrollador y depuro, el lado del servidor de solicitud devuelve que el tamaño excede el límite de Json.
Casey
Este es mi problema, cómo solucionar esto según el sitio web de Microsoft. "Básicamente, el JavaScriptSerializer" interno "respeta el valor de maxJsonLength cuando se llama desde un método web. El uso directo de un JavaScriptSerializer (o el uso a través de un método / Controlador de acción MVC) no respeta la propiedad maxJsonLength, al menos no desde el systemWebExtensions .scripting.webServices.jsonSerialization sección que usted define en el archivo web.config ".
Casey
Casi me pregunto si podría decir, dividir algo más de 50k en trozos como List <type string>, luego enviarlo al controlador y hacer un bulder de cadena, luego importar a SQL.
Casey
2

Seguramente todos se han perdido un truco aquí. El límite de tamaño de archivo actual de un archivo json es de 18,446,744,073,709,551,616 caracteres o si prefiere bytes, o incluso 2 ^ 64 bytes si está buscando infraestructuras de 64 bits al menos.

Para todos los efectos, podemos suponer que es ilimitado ya que probablemente tendrá dificultades para resolver este problema ...

Perfecto64
fuente
-6

La longitud máxima de las cadenas JSON. El valor predeterminado es 2097152 caracteres, lo que equivale a 4 MB de datos de cadena Unicode.

Consulte la siguiente URL

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

Shashi Keshar
fuente
2
JSON en sí no tiene límite inherente. Lo que publicaste es específico para .net y su JavaScriptSerializerclase. Y MaxJsonLengthya se ha abordado en otras respuestas.
David Makogon
¿Alguien puede publicar cómo manejar más grande que el .NET JavaScriptSerializer? Por ejemplo, ¿cómo puedo enviar un json grande al controlador MVC pero usar el serializador de Newtonsoft para manejarlo o no es posible ya que está integrado en .NET y se utiliza el precontrolador?
Casey