JSON | |
---|---|
Extensión | .json[una] |
tipo MIME | aplicación/json [2] |
Tipo de formato | El intercambio de datos |
Expandido desde | JavaScript |
Estándar(es) | RFC 8259 |
Sitio web | json.org _ |
Archivos multimedia en Wikimedia Commons |
JSON ( Notación de objetos de JavaScript en inglés , generalmente pronunciado como / dʒ eɪ s ən / JAY-sən [3] ) es un formato de intercambio de datos basado en texto basado en JavaScript . Como muchos otros formatos de texto, JSON es fácil de leer para los humanos. El formato JSON fue desarrollado por Douglas Crockford [4] .
A pesar de derivarse de JavaScript (más precisamente, un subconjunto de lenguaje del estándar ECMA-262 de 1999 ), el formato se considera independiente del lenguaje y se puede usar con casi cualquier lenguaje de programación . Para muchos idiomas, existe un código listo para crear y procesar datos en formato JSON.
Debido a su concisión en comparación con XML , el formato JSON puede ser más adecuado para serializar estructuras complejas. Se utiliza en aplicaciones web tanto para el intercambio de datos entre el navegador y el servidor ( AJAX ), como entre servidores ( emparejamientos HTTP programáticos).
Dado que el formato JSON es un subconjunto de la sintaxis del lenguaje JavaScript, se puede deserializar rápidamente con JSON.parse().
El texto JSON es (codificado) una de dos estructuras:
Las estructuras de datos utilizadas por JSON son compatibles con cualquier lenguaje de programación moderno, lo que hace posible usar JSON para intercambiar datos entre diferentes lenguajes de programación y sistemas de software.
Los siguientes se pueden utilizar como valores en JSON:
Una cadena es muy similar a un literal del mismo tipo de datos en JavaScript . Un número también es muy similar a un número de JavaScript, excepto que usa solo formato decimal (con un punto como separador). Se pueden insertar espacios entre dos elementos sintácticos cualesquiera.
El siguiente ejemplo muestra una representación JSON de datos sobre un objeto que describe a una persona. Los datos contienen campos de cadena de nombre y apellido , información de dirección y una matriz que contiene una lista de números de teléfono. Como puede ver en el ejemplo, el valor puede ser una estructura anidada.
{ "firstName" : "Ivan" , "lastName" : "Ivanov" , "address" : { "streetAddress" : "Moskovskoe sh., 101, kv.101" , "city" : "Leningrad" , "postalCode" : 101101 }, "números de teléfono" : [ "812 123-1234" , "916 123-4567" ] }Tanto los números como las cadenas se pueden usar como valores en JSON. Por lo tanto, el registro "postalCode": "101101"contiene una cadena y "postalCode": 101101 , ya un valor numérico. Debido a la escritura débil en JavaScript y PHP , una cadena puede convertirse en un número y no afectar la lógica del programa. Sin embargo, se recomienda manejar el tipo de valor con cuidado, ya que JSON se usa para el intercambio entre sistemas.
En XML, dicha estructura se vería así:
<persona> <nombre> Iván </nombre> <apellido> Ivanov </apellido> <dirección> <dirección de calle> Moskovskoye sh., 101, kv.101 </dirección de calle> <ciudad> Leningrado </ciudad> <código postal> 101101 </postalCode> </address> <phoneNumbers> <phoneNumber> 812 123-1234 </phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </person>o así:
<persona firstName= "Ivan" lastName= "Ivanov" > <address streetAddress= "101 Moskovskoye sh., apt. 101" city= "Leningrad" postalCode= "101101" /> <phoneNumbers> <phoneNumber> 812 123-1234 < /número de teléfono> <número de teléfono> 916 123-4567 </número de teléfono> </números de teléfono> </persona>JSON5 es una extensión propuesta del formato json de acuerdo con la sintaxis de ECMAScript 5, debido a que json se usa no solo para la comunicación entre programas, sino que también se crea / edita manualmente [6] . Un archivo JSON5 siempre es un código ECMAScript 5 válido. JSON5 es compatible con versiones anteriores de JSON. Para algunos lenguajes de programación ya existen analizadores json5 [7] .
Algunas innovaciones:
Tanto funcional como sintácticamente, JSON es un subconjunto del lenguaje YAML . En particular, la especificación YAML 1.2 establece que "cualquier archivo JSON es un archivo YAML válido" [8] . El analizador YAML más común también es capaz de manejar JSON [9] . La especificación YAML anterior a la 1.2 no cubría por completo a JSON, principalmente debido a la falta de soporte UTF-32 nativo de YAML , así como al requisito de espacio después del delimitador de coma; además, la especificación JSON incluía comentarios de estilo /* */.
La diferencia más importante entre YAML es un conjunto de extensiones de sintaxis que no tienen equivalente en JSON:
JSON Schema es uno de los lenguajes para describir la estructura de un documento JSON. Utiliza sintaxis JSON. Basado en los conceptos de XML Schema , RelaxNG , Kwalify . JSON Schema es un lenguaje autodescriptivo: cuando se usa para procesar datos y describir su validez, se pueden usar las mismas herramientas de serialización / deserialización [10] .
El estándar JSON no admite referencias a objetos , pero puede lograr el resultado deseado con convenciones adicionales. La recomendación del W3C para datos vinculados es JSON-LD , que utiliza el modelo de datos RDF . En JSON-LD, se agrega un contexto (contexto) a los datos, vinculando las propiedades de los objetos de documento JSON con elementos de ontología [11] .
El siguiente ejemplo de código Javascript muestra cómo un navegador puede usar XMLHttpRequest para solicitar un objeto JSON del servidor (se omite el lado del servidor del programa; debe contener código que envíe datos en formato de cadena JSON en respuesta a solicitudes de url).
var http_request = new XMLHttpRequest (); http_solicitud . onreadystatechange = function () { if ( http_request . readyState !== 4 ) return ; if ( http_request . status !== 200 ) arroja un nuevo error ( 'la solicitud fue rechazada' ); hacer_algo_con_objeto ( JSON . parse ( http_request . responseText )); http_solicitud = nulo ; }; http_solicitud . abierto ( "OBTENER" , url , verdadero ); http_solicitud . enviar ( nulo );Tenga en cuenta que este ejemplo de XMLHttpRequest no es compatible con Internet Explorer hasta la versión 6 inclusive, por lo que se debe usar un código ligeramente diferente para ellos. Las posibilidades de utilizar XMLHttpRequest están limitadas por la misma política de origen: la URL de respuesta a la solicitud debe estar en el mismo dominio DNS que el servidor que aloja la página que solicita la respuesta. Alternativamente, se usa un enfoque JSONP , que implica el uso de una llamada de función codificada que se pasa entre el cliente y el servidor para que el cliente pueda cargar datos codificados en JSON de dominios de terceros y notificar a la persona que llama sobre la finalización, aunque esto introduce algo de seguridad. riesgos y requisitos adicionales del servidor.
Como alternativa, puede usar elementos en el código de la página <iframe>para solicitar datos JSON de forma asíncrona o simplemente <form action="url_to_cgi_script">. Estos enfoques prevalecían antes del soporte generalizado para XMLHttpRequest.
También puede usar etiquetas dinámicas para pasar datos JSON <script>. Este método puede eludir la misma política de origen, pero introduce código vulnerable. JSONRequest se ha sugerido como una alternativa más segura .
Aunque JSON está destinado a ser serializado, su sintaxis es similar a JavaScript y esto crea una serie de problemas de seguridad. A menudo, se aplica una función a los datos recibidos de una fuente externa en formato JSON eval()sin ninguna validación preliminar.
Dado que JSON se representa como una pieza de código JavaScript sintácticamente correcta, la forma más fácil de analizar datos JSON en un programa JavaScript es utilizar la función integrada JavaScript eval(), que está diseñada para ejecutar expresiones JavaScript. Con este enfoque, no es necesario utilizar analizadores adicionales.
La técnica de uso eval()hace que el sistema sea vulnerable si la fuente de los datos JSON utilizados no es de confianza . Dichos datos pueden ser código JavaScript malicioso para ataques de Code Injection Usando esta vulnerabilidad, es posible llevar a cabo robo de datos, falsificación de autenticación.
Se ha propuesto una nueva función JSON.parse()que solo puede procesar datos JSON. Se introdujo en la cuarta versión del estándar ECMAScript y se describe en el artículo "JSON: una alternativa sin grasa a XML" [12] . Actualmente está disponible como una biblioteca de JavaScript [13] y se ha incluido en la quinta edición de ECMAScript.
Las versiones recientes de los navegadores web tienen soporte integrado para JSON y son capaces de procesarlo.
El uso mal concebido de JSON hace que los sitios sean vulnerables a la falsificación de solicitudes entre sitios (CSRF o XSRF) [14] . Dado que la etiqueta <script>permite el uso de una fuente que no pertenece al mismo dominio que el recurso que usa, esto permite que el código se ejecute bajo la apariencia de datos JSON en el contexto de una página arbitraria, lo que hace posible comprometer contraseñas o otra información sensible de usuarios que están autorizados en otro sitio.
Esto solo parece ser un problema si los datos JSON contienen información confidencial que puede verse comprometida por un tercero y si el servidor se basa en política para bloquear el acceso a los datos cuando encuentra una solicitud externa Esto no es un problema si el servidor determina la validez de la solicitud, proporcionando datos solo si son correctos. No se puede utilizar una cookie HTTP para determinar esto. El uso exclusivo de una cookie HTTP se aprovecha mediante la falsificación de solicitudes entre sitios .
JSONP ( JSON Padding ) es una extensión de JSON cuando el nombre de una función de devolución de llamada se especifica como argumento de entrada.
La tecnología se basa en el hecho de que la política de seguridad del navegador no prohíbe el uso de la etiqueta <script type="text/javascript" src="…"></script>para acceder a servidores distintos del servidor desde el que se cargó la página.
Sin utilizar la tecnología JSONP (es decir, utilizando solo la codificación de datos JSON), el servidor solo puede devolver datos. Por ejemplo, así:
{ "papel" : "A4" , "contar" : 5 }Sin embargo, estos son solo datos y no pueden afectar al navegador.
Usando la técnica JSONP, el nombre de la función de devolución de llamada se pasa al servidor de terceros en la cadena de llamada (GET):
<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>Aquí, el parámetro jsonp contiene el nombre de devolución de llamada de la función parseResponse.
Ahora el servidor externo ejemplo.com puede devolver el siguiente código:
parseResponse ({ "papel" : "A4" , "contar" : 5 })Ahora el código llama a la función javascript del primer dominio.
La idea se propuso originalmente en el blog de MacPython en 2005 [15] y actualmente la utilizan muchas aplicaciones Web 2.0 , como Dojo Toolkit Applications, Google Toolkit Applications [ https://www.webcitation.org/6Djo88laj?url=http: / /www.gwtapps.com/?p=42%5d y servicios web de zanox. Se han propuesto extensiones adicionales a este protocolo para incluir argumentos adicionales, como en el caso de JSONPP [16] compatible con los servicios web de S3DB .
Debido a que JSONP usa etiquetas de script, las llamadas están esencialmente abiertas al mundo. Por esta razón, JSONP puede no ser apropiado para almacenar datos confidenciales [17] .
La inclusión de etiquetas de secuencias de comandos de sitios remotos les permite pasar cualquier contenido en el sitio. Si el sitio remoto tiene vulnerabilidades que permiten la inyección de Javascript, el sitio original también puede verse afectado.
JSONPP ( eng. JSON parametrizado con relleno - "JSON parametrizado con relleno") - el desarrollo de la idea JSONP.
JSONPP incluye la URL de origen, el nombre de la función que procesará los datos JSON, la cadena para evaluar después de que se reciban los datos y la cadena para evaluar cuando finalicen los datos:
JSON_call ( SRC , JSONP , JSONPP , ONLOAD );finalmente da la vuelta
respuesta = JSONP ( SRC ) { eval ( JSONPP ( respuesta )); eval ( ONLOAD ); }En general, la cantidad de parámetros no es importante para la idea de JSONPP en sí. SRC, JSONP, JSONPP (y su procesamiento en el lado del servidor y luego en el lado del cliente) es suficiente para que sea JSONPP.
Considere el ejemplo de trabajar con el servicio S3DB.
función s3db_jsonpp_call ( src , next_eval ){ var call = "call_" + Math . aleatorio (). a la cadena (). reemplazar ( /\./g , "" ); var headID = documento . getElementsByTagName ( "cabeza" )[ 0 ]; var script = documento . crearElemento ( 'script' ); guion _ identificación = llamar ; guion _ tipo = 'texto/javascript' ; // usando json acolchado y parametrizado src = src + "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval + "&onload=remove_element_by_id('" + script . id + "')" ; guion _ origen = origen ; ID de cabeza . appendChild ( script ); // recuperar respuesta } función s3db_jsonpp ( ans , jsonpp ){ eval ( jsonpp ); volver ans ; } función remove_element_by_id ( id ){ var e = documento . getElementById ( id ); mi . padreNodo . removeChild ( e ); devolver falso ; }En el ejemplo, la función s3db_jsonpp_call()crea un elemento de secuencia de comandos en la parte principal del DOM cuyo src coincide con la llamada JSONPP.
Después de recibir una respuesta del servidor, se llamará s3db_jsonpp() ; se pasa en los parámetros de llamada, como debería ser de acuerdo con las reglas de JSONP.
Internamente , s3db_jsonpp()funcionará eval(jsonpp)y se devolverá el valor de ans.
Llamar a eval(onload) da como resultado la ejecución remove_element_by_id()con el id del script creado en head y finalmente lo elimina, porque ya no se usará de todos modos, ya que el id en el ejemplo se generó aleatoriamente al principio de la función s3db_jsonpp_call(). Esta llamada está en la respuesta del servidor.
JSONB es una extensión JSON binaria introducida en PostgreSQL en la versión 9.4.18. De hecho, JSONB es una representación binaria de JSON [18] , con la diferencia de que los espacios se eliminan en las cadenas almacenadas, la clasificación de objetos no se conserva y solo se almacena el último valor de las claves duplicadas [19] .
Lenguajes de marcado de documentos | |
---|---|
documentos de oficina | |
bien conocido | |
menos conocido |
|
Web y sitios web | |
---|---|
globalmente | |
En la zona | |
Tipos de sitios y servicios |
|
Creación y mantenimiento | |
Tipos de diseños, páginas, sitios. | |
Técnico | |
Marketing | |
sociedad y Cultura |