Definición del Formato JSON
JavaScript Object Notation (JSON) es un formato de serialización de datos basado en texto, diseñado para ser ligero, portable y compatible con múltiples lenguajes de programación. Se deriva del estándar ECMAScript Programming Lnaguage Standard, Third Edition [ECMA], y define reglas para representar datos estructurados.
JSON consta de cuatro tipos básicos (cadena, número, booleano y nulo) y dos tipos estructurados (objeto y arreglo). Una cadena es una secuencia de cero o más caracteres Unicode. Un objeto es una colección desordenada de pares nombre-valor, donde el nombre es una cadena y el valor puede ser cualquiera de los tipos mencionados. Un arreglo es una secuencia ordenada de valores.
Sintaxis JSON
Un texto JSON es una secuencia de tokens que incluye seis caracteres estructurales, cadenas, números y tres literales. El texto JSON debe ser la serialización de un objeto o arreglo.
texto-json = objeto / arreglo
Los seis caracteres estructurales son:
inicio-arreglo = ws %x5B ws ; [
inicio-objeto = ws %x7B ws ; {
fin-arreglo = ws %x5D ws ; ]
fin-objeto = ws %x7D ws ; }
separador-nombre = ws %x3A ws ; :
separador-valor = ws %x2C ws ; ,
Los espacios en blanco (ws) pueden aparecer opcionalmente alrededor de estos caracteres, definidos como:
ws = *(
%x20 / ; espacio
%x09 / ; tabulación horizontal
%x0A / ; salto de línea
%x0D ; retorno de carro
)
Valores
Un valer JSON debe ser un objeto, arreglo, número, cadena o uno de los literales false, null o true. Estos literales deben escribirse en minúsculas.
valor = false / null / true / objeto / arreglo / número / cadena
false = %x66.61.6C.73.65 ; false
null = %x6E.75.6C.6C ; null
true = %x74.72.75.65 ; true
Objetos
Un objeto se representa con llaves que encierran cero o más pares nombre-valor, separados por comas. Los nombres deben ser cadenas y se sugiere que sean únicos dentro del objeto.
objeto = inicio-objeto [ miembro *( separador-valor miembro ) ] fin-objeto
miembro = cadena separador-nombre valor
Arreglos
Un arreglo se representa con corchetes que encierran cero o más valores, separados por comas.
arreglo = inicio-arreglo [ valor *( separador-valor valor ) ] fin-arreglo
Números
Los números se representan similar a otros lenguajes, con una parte entera opcional precedida por un signo menos, seguida de una parte decimal y/o exponente. No se permiten formatos octal o hexadecimal, ni ceros iniciales.
número = [ menos ] entero [ fracción ] [ exponente ]
punto-decimal = %x2E ; .
dígit1-9 = %x31-39 ; 1-9
e = %x65 / %x45 ; e E
exponente = e [ menos / más ] 1*DÍGITO
fracción = punto-decimal 1*DÍGITO
entero = cero / ( dígit1-9 *DÍGITO )
menos = %x2D ; -
más = %x2B ; +
cero = %x30 ; 0
Cadenas
Las cadenas se delimitan por comillas dobles. Los caracteres deben escaparse si son comillas, barra invertida o caracteres de control (U+0000 a U+001F). Cualquier carácter puede representarse como una secuencia de escape Unicode.
cadena = comilla *carácter comilla
carácter = no-escapado /
escape (
%x22 / ; " comilla doble U+0022
%x5C / ; \ barra invertida U+005C
%x2F / ; / barra diagonal U+002F
%x62 / ; b retroceso U+0008
%x66 / ; f salto de página U+000C
%x6E / ; n salto de línea U+000A
%x72 / ; r retorno de carro U+000D
%x74 / ; t tabulación U+0009
%x75 4HEXDIG ) ; uXXXX U+XXXX
escape = %x5C ; \
comilla = %x22 ; "
no-escapado = %x20-21 / %x23-5B / %x5D-10FFFF
Codificación
Los textos JSON deben usar codificación Unicode, siendo UTF-8 el predeterminado. La codificación puede determinarse inspeccionando los primeros bytes: si comienzan con 00 00 00 xx es UTF-32BE, 00 xx 00 xx es UTF-16BE, xx 00 00 00 es UTF-32LE, xx 00 xx 00 es UTF-16LE, y xx xx xx xx es UTF-8.
Analizador y Generador
Un analizador JSON debe aceptar todos los textos que cumplan con la sintaxis JSON, y puede aceptar textos no conformes. Un generador JSON debe producir textos que cumplan estrictamente con la sintaxis.
Consideraciones IANA
El tipo MIME para JSON es application/json. Los parámetros son nulos, y las consideraciones de codificación dependen del formato: si es UTF-8, es de 8 bits; si es UTF-16 o UTF-32, requiere codificación de transferencia binaria.
Seguridad
JSON es un subconjunto de JavaScript, pero excluye asignaciones e invocaciones, por lo que es seguro. Un texto JSON puede pasarse de forma segura a eval() en JavaScript si cumple ciertas condiciones. La siguiente función en JavaScript verifica la seguridad antes de evaluar:
function analizarJSON(seguro) {
const patronPeligroso = /[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/;
const limpio = seguro.replace(/"(\\.|[^"\\])*"/g, '');
if (!patronPeligroso.test(limpio)) {
return eval('(' + seguro + ')');
}
return undefined;
}
Ejemplos
Un objeto JSON típico:
{
"Imagen": {
"Ancho": 800,
"Alto": 600,
"Título": "Vista desde el piso 15",
"Miniatura": {
"URL": "http://www.ejemplo.com/imagen/481989943",
"Alto": 125,
"Ancho": "100"
},
"IDs": [116, 943, 234, 38793]
}
}
Un arreglo con dos objetos:
[
{
"precisión": "zip",
"Latitud": 37.7668,
"Longitud": -122.3959,
"Dirección": "",
"Ciudad": "SAN FRANCISCO",
"Estado": "CA",
"CódigoPostal": "94107",
"País": "US"
},
{
"precisión": "zip",
"Latitud": 37.371991,
"Longitud": -122.026020,
"Dirección": "",
"Ciudad": "SUNNYVALE",
"Estado": "CA",
"CódigoPostal": "94085",
"País": "US"
}
]
Referencias
[ECMA] European Computer Manufacturers Association, "ECMAScript Language Specification 3rd Edition", December 1999.
[RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20, October 1969.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC4234] Crocker, D. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 4234, October 2005.