What is JSON?

JSON (JavaScript Object
Notation – Notación de Objetos de JavaScript) es un formato ligero de intercambio
de datos. Leerlo y escribirlo es simple para humanos, mientras que para las
máquinas es simple interpretarlo y generarlo. Está basado en un subconjunto del
Lenguaje de
Programación JavaScript
, Standard ECMA-262 3rd
Edition – Diciembre 1999
. JSON es un formato de texto que es completamente
independiente del lenguaje pero utiliza convenciones que son ampliamente
conocidos por los programadores de la familia de lenguajes C, incluyendo C,
C++, C#, Java, JavaScript, Perl, Python, y muchos otros. Estas propiedades
hacen que JSON sea un lenguaje ideal para el intercambio de datos.

JSON es un subconjunto de
la notación literal de objetos de JavaScript que no requiere el uso de XML.

La
simplicidad de JSON ha dado lugar a la generalización de su uso, especialmente
como alternativa a
XML en AJAX. Una de las supuestas
ventajas de JSON sobre
XML como formato de
intercambio de datos en este contexto es que es mucho más sencillo escribir un
analizador semántico de JSON. En JavaScript, JSON puede ser analizado
trivialmente usando el procedimiento
eval(), lo cual ha sido
fundamental para la aceptación de JSON por parte de la comunidad de
desarrolladores Ajax, debido a la ubicuidad de JavaScript en casi cualquier
navegador web.

En la
práctica, los argumentos a favor de la facilidad de desarrollo de analizadores
o del rendimiento de los mismos son poco relevantes, debido a las cuestiones de
seguridad que plantea el uso de
eval() y el auge del
procesamiento nativo de XML incorporado en los navegadores modernos. Por esa
razón, JSON se emplea habitualmente en entornos donde el tamaño del flujo de
datos entre cliente y servidor es de vital importancia (de aquí su uso por
Yahoo, Google, etc, que atienden a millones de usuarios) cuando la fuente de
datos es explícitamente de fiar y donde no es importante el no disponer de
procesamiento XSLT para manipular los datos en el cliente.

Si bien es
frecuente ver JSON posicionado contra XML, no es infrecuente el uso de
JSON y XML en la misma aplicación. Por ejemplo, una aplicación de cliente que
integra datos de
Google Maps con datos
meteorológicos en
SOAP hacen necesario
soportar ambos formatos.

Cada vez hay
más soporte de JSON mediante el uso de paquetes escritos por terceras partes.
La lista de lenguajes soportados incluye
ActionScript, C, C#, ColdFusion, Common Lisp, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, y Lua.

En Diciembre
de 2005
Yahoo! comenzó a dar soporte
opcional de JSON en algunos de sus
servicios web

El término
JSON está altamente difundido en los medios de programación, sin embargo, es un
término mal descrito ya que en realidad es solo una parte de la definición del
estándar ECMA-262 en que está basado Javascript. De ahí que ni Yahoo, ni Google
emplean JSON, sino LJS. Una de las cualidades intrínsecas de Javascript
denominada LJS (Literal Javascript)facilita el flujo de datos e incluso de
funciones, para la cual no requiere la función
eval() si son datos los que
se transfieren como en el caso de xml. Todo lo referente a transferencia de
datos en todos sus tipos, incluyendo arrays, booleans, integers, etc. no
requieren de la función
eval(), y es precisamente en eso en
donde supera por mucho JavaScript al XML, si se utiliza el LJS y no la
incorrecta definición de JSON.

Uso de JSON

En teoría, es
trivial analizar JSON en JavaScript usando la función
eval() incorporada en el
lenguaje. Por ejemplo:

miObjeto = eval('(' + json_datos + ')');

En la
práctica, las consideraciones de seguridad por lo general recomiendan no usar eval
sobre datos crudos y debería usarse un analizador JavaScript distinto para
garantizar la seguridad. El analizador proporcionado por JSON.org usa
eval() en su función de
análisis, protegiéndola con una expresión regular de forma que la función sólo
ve expresiones seguras.

YAML es un superconjunto
de JSON que trata de superar algunas de las limitaciones de éste. Aunque es
significativamente más complejo (
[1]), aún puede
considerarse como ligero. El lenguaje de programación
Ruby utiliza YAML como el
formato de
serialización por defecto. Así pues, es posible manejar JSON con bastante sencillez.

YAML es un formato de serialización de datos legible por humanos inspirado en lenguajes
como
XML, C, Python, Perl, así como el formato para correos
electrónicos especificado por el
RFC 2822. YAML fue propuesto
por
Clark Evans en 2001, quien lo diseñó
junto a
Ingy döt Net y Oren Ben-Kiki.

YAML es un acrónimo recursivo que significa "YAML Ain’t Another Markup
Language (en castellano, "YAML no es otro
lenguaje de marcado"). A comienzos de su
desarrollo, YAML significaba "Yet Another Markup Language"
("Otro lenguaje de marcado
más") para distinguir su propósito centrado en
los datos en lugar del marcado de documentos. Sin embargo, dado que se usa
frecuentemente XML para serializar datos y XML es un auténtico lenguaje de
marcado de documentos, es razonable considerar YAML como un
lenguaje de marcado ligero.

YAML fue
creado bajo la creencia de que todos los datos pueden ser representados
adecuadamente como combinaciones de listas,
hashes (mapeos) y datos
escalares (valores simples). La sintaxis es relativamente sencilla y fue
diseñada teniendo en cuenta que fuera muy legible pero que a la vez fuese
fácilmente mapeable a los tipos de datos más comunes en la mayoría de los
lenguajes de alto nivel. Además, YAML utiliza una notación basada en el
indentado y/o un conjunto de caracteres Sigil distintos de los que se usan en
XML, haciendo que sea fácil componer ambos lenguajes.

· 
Los contenidos en YAML se describen utilizando el conjunto de caracteres
imprimibles de
Unicode,
bien en
UTF-8
o
UTF-16.

·  La estructura del documento se
denota indentando con espacios en blanco; sin embargo no se permite el uso de
caracteres de tabulación para indentar.

JSON
está constituído por dos estructuras:

  • Una
    colección de pares de nombre/valor. En varios lenguajes esto es conocido
    como un objeto, registro, estructura, diccionario, tabla hash,
    lista de claves o un arreglo asociativo.
  • Una
    lista ordenada de valores. En la mayoría de los lenguajes, esto se
    implementa como arreglos, vectores, listas o sequencias.

En JSON, se
presentan de estas formas:

Un objeto
es un conjunto desordenado de pares nombre/valor. Un objeto comienza con
{ (llave
de apertura)
y termine con } (llave de
cierre)
.
Cada nombre es seguido por
: (dos puntos) y los pares
nombre/valor están separados por
, (coma).

Un número
es similar a un número C o Java, excepto que no se usan los formatos octales y
hexadecimales.

Una cadena
de caracteres
es una colección de cero o más caracteres Unicode, encerrados
entre comillas dobles, usando barras divisorias invertidas como escape. Un
carácter está representado por una cadena de caracteres de un único carácter.
Una cadena de carateres es parecida a una cadena de caracteres C o Java.

Los espacios
en blanco pueden insertarse entre cualquier par de símbolos.

Exceptuando
pequeños detalles de encoding, esto describe completamente el lenguaje.

JSON vs XML:

XML, es un lenguaje de
intercambio de información estructurada desarrollado por la
W3C, con la poposición de
ser un estandard entre diferentes plataformas, desde bases de datos, editores
de texto,…

Es una
tecnología sencilla y fácil de entender, además se aplica un razonamiento
lógico a su estructura.

<menu id="file" value="File">
  <popup>
    <menuitem value="New" onclick="CreateNewDoc()" />
    <menuitem value="Open" onclick="OpenDoc()" />
    <menuitem value="Close" onclick="CloseDoc()" />
  </popup>
</menu>

Por otro lado
JSON está pegando fuerte
en la programación web debido a
las ventajas que
ofrece
sobre el XML.

JSON es un subconjunto de
la notación literal de objetos de Javascript pero no requiere el uso de
Javascript.

A simple
vista, la facilidad que conlleva el uso de JSON en comparación con la
laboriosa tarea de recorrer un XML, por ejemplo para
trabajar con Ajax, es uno de los
motivos por los cuales los desarrolladores están volcando sus esfuerzos en esta
herramienta de intercambio de datos.

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}
 
XML ejemplo:
 
<widget>

    <debug>on</debug>

    <window title="Sample Konfabulator Widget">

        <name>main_window</name>

        <width>500</width>

        <height>500</height>

    </window>

    <image src="Images/Sun.png" name="sun1">

        <hOffset>250</hOffset>

        <vOffset>250</vOffset>

        <alignment>center</alignment>

    </image>

    <text data="Click Here" size="36" style="bold">

        <name>text1</name>

        <hOffset>250</hOffset>

        <vOffset>100</vOffset>

        <alignment>center</alignment>

        <onMouseUp>

            sun1.opacity = (sun1.opacity / 100) * 90;

        </onMouseUp>

    </text>

</widget>
 
El mismo ejemplo en JSON
 
{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",

        "name": "main_window",

        "width": 500,

        "height": 500
    },

    "image": {
        "src": "Images/Sun.png",
        "name": "sun1",

        "hOffset": 250,

        "vOffset": 250,

        "alignment": "center"
    },

    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",

        "name": "text1",

        "hOffset": 250,

        "vOffset": 100,

        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

Como
problemas, los desarrolladores experimentados encuentran que la utilización de
eval() para para analizar JSON
es algo delicado y puede atentar la seguridad del sitio.

var http_request = new XMLHttpRequest();
 var url = "http://example.net/jsondata.php";
 // Esta URL debería devolver datos JSON
 
 // Descarga los datos JSON del servidor.
 http_request.onreadystatechange = handle_json;
 http_request.open("GET", url, true);
 http_request.send(null);
 
function handle_json() {
  if (http_request.readyState == 4) {
    if (http_request.status == 200) {
      var json_data = http_request.responseText;
      var the_object = eval(”(” + json_data + “)”);
    } else {
      alert(”Ha habido un problema con la URL.”);
    }
    http_request = null;
  }
}

Obsérvese que
el uso de XMLHttpRequest en este ejemplo no es compatible con todos los
navegadores, aunque existen variaciones sintácticas para
Internet Explorer, Opera, Safari, y navegadores basados en Mozilla.

También es
posible usar elementos
<iframe> ocultos para
solicitar los datos de manera asíncrona, o usar peticiones
<form
target="url_to_cgi_script" />
. Estos métodos eran los más
habituales antes del advenimiento del uso generalizado de XMLHTTPRequest.

Si bien los
defensores de JSON a menudo notan que éste es más abreviado que XML, obsérvese
que los dos ejemplos tienen unos 190 caracteres cuando se eliminan los espacios
en blanco. Además, el uso de compresión GZIP para enviar los datos al navegador
puede reducir la diferencia de tamaños entre ambos formatos. De hecho, cuando
se usa GZIP sobre los ejemplos anteriores el ejemplo en XML es más pequeño por
6 bytes. Si bien esto no es concluyente, muestra que es necesario experimentar
con el conjunto de datos a tratar para determinar qué formato será más
eficiente en términos de tamaño. JSON no es siempre más pequeño que XML.

El beneficio
de JSON, entonces, no es que sea más pequeño a la hora de transmitir, sino que
representa mejor la estructura de los datos y requiere menos codificación y
procesamiento.

XML goza de
mayor soporte y ofrece muchas más herramientas de desarrollo (tanto en el lado
del cliente como en el lado del servidor). Hay muchos analizadores JSON en el
lado del servidor, existiendo al menos un analizador para la mayoría de los
entornos. En algunos lenguajes, como Java o PHP, hay diferentes
implementaciones donde escoger. En JavaScript, el análisis es posible de manera
nativa con la función
eval(). Ambos formatos carecen de un
mecanismo para representar
grandes objetos binarios.

Con
independencia de la comparación con XML, JSON puede ser muy compacto y
eficiente si se usa de manera efectiva. Por ejemplo, la aplicación
DHTML de búsqueda en BarracudaDrive recibe los listados
de directorio como JSON desde el servidor. Esta aplicación de búsqueda está
permanentemente consultando al servidor por nuevos directorios, y es
notablemente rápida, incluso sobre una conexión lenta.

Los entornos
en el servidor normalmente requieren que se incorpore una función u objeto
analizador de JSON. Algunos programadores, especialmente los familiarizados con
el lenguaje
C, encuentran JSON más
natural que XML, pero otros desarrolladores encuentran su escueta notación algo
confusa, especialmente cuando se trata de datos fuertemente jerarquizados o
anidados muy profundamente.

Hay más
comparaciones entre JSON y XML en esta
página de ejemplo (en inglés).

Por estos
motivos y algunos más,
se plantean debates y se intenta decidir cual es la forma correcta
de intercambiar información
.

About justindeveloper

I am MCP (Microsoft Certified Professional). MCTS (Microsoft Certified Technology Specialist) and MCPD (Microsoft Certified Professional Developer), also I am SAP Business One Certified!! Desarrollando desde el IDE de Visual Studio NET 2003 hasta ahora con el Visual Studio NET 2010. Desde Microsoft SQL Server 2000 hasta ahora con el Microsoft SQL Server 2008 R2 y tambien con SharePoint, desde WSS 3.0 y MOSS 2007 y ahora familirizandome con el Sharepoint Foundation 2010 & Sharepoint Server 2010. The software development will follow being every time more wonderful!
This entry was posted in Development. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s