Saltar ao contido

JavaScript Object Notation

Na Galipedia, a Wikipedia en galego.
Revisión feita o 23 de abril de 2012 ás 16:05 por Th3B1NaR1C0dE (conversa | contribucións) (Nova páxina: "'''JSON''', acrónimo de ''JavaScript Object Notation'', é un formato lixeiro para o intercambio de datos. JSON é un subconjunto da notación literal de obxectos de [[JavaScript...")
(dif) ← Revisión máis antiga | Revisión actual (dif) | Revisión máis nova → (dif)

JSON, acrónimo de JavaScript Object Notation, é un formato lixeiro para o intercambio de datos. JSON é un subconjunto da notación literal de obxectos de JavaScript que non require o uso de XML.

A simplicidade de JSON deu lugar á generalización do seu uso, especialmente como alternativa a XML en AJAX. Unha das supostas vantaxes de JSON sobre XML como formato de intercambio de datos neste contexto é que é moito máis sinxelo escribir un analizador sintáctico (parser) de JSON. En JavaScript, un texto JSON pódese analizar facilmente usando o procedemento eval(), o cal foi fundamental para que JSON fose aceptado por parte da comunidade de desarrolladores AJAX, debido á ubicuidad de JavaScript en case calquera navegador web.

Na práctica, os argumentos a favor da facilidade de desenvolvemento de analizadores ou do rendemento dos mesmos son pouco relevantes, debido ás cuestións de seguridade que expón o uso de eval() e o auxe do procesamiento nativo de XML incorporado nos navegadores modernos. Por esa razón, JSON emprégase habitualmente en contornas onde o tamaño do fluxo de datos entre cliente e servidor é de vital importancia (de aquí o seu uso por Yahoo, Google, etc, que atenden a millóns de usuarios) cando a fonte de datos é explicitamente de fiar e onde non é importante o non dispor de procesamiento XSLT para manipular os datos no cliente.

Aínda que é frecuente ver JSON situado contra XML, tamén é frecuente o uso de JSON e XML na mesma aplicación. Por exemplo, unha aplicación de cliente que integra datos de Google Maps con datos meteorolóxicos en SOAP fan necesario soportar ambos os formatos.

Cada vez hai máis soporte de JSON mediante o uso de paquetes escritos por terceiras partes. A lista de linguaxes soportadas inclúe , ActionScript, C, C++, C#, ColdFusion, Common Lisp, Delphi, E, Eiffel, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Lua e Visual FoxPro.

En decembro de 2005 Yahoo! comezou a dar soporte opcional de JSON nalgúns dos seus servizos web.[1]

O termo JSON está altamente difundido nos medios de programación, con todo, é un termo mal descrito xa que en realidade é só unha parte da definición do estándar ECMA-262 en que está baseado Javascript. Por iso é polo que nin Yahoo, nin Google empregan JSON, senón LJS. Unha das calidades intrínsecas de Javascript denominada LJS (Literal Javascript) facilita o fluxo de datos e mesmo de funcións, para a cal non require a función eval() se son datos os que se transfiren como no caso de XML. Todo o referente a transferencia de datos en todos os seus tipos, incluíndo arrays, booleans, integers, etc. non requiren da función eval(), e é precisamente niso onde supera por moito JavaScript ao XML, se se utiliza o LJS e non a incorrecta definición de JSON.

Uso de JSON

En teoría, é trivial analizar JSON en JavaScript usando a función eval() incorporada na linguaxe. Por exemplo:

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

Na práctica, as consideracións de seguridade polo xeral recomendan non usar eval sobre datos crus e debería usarse un analizador JavaScript distinto para garantir a seguridade. O analizador proporcionado por JSON.org usa eval() na súa función de análise, protexéndoa cunha expresión regular de forma que a función só ve expresións seguras.

Un exemplo de acceso a datos JSON usando XMLHttpRequest é:

var http_request = new XMLHttpRequest();
var url = "http://example.net/jsondata.php"; // Esta URL debería devolver datos JSON
 
// Descarga os datos JSON do 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("Ocurreu un problema coa URL.");
    }
    http_request = null;
  }
}

Obsérvese que o uso de XMLHttpRequest neste exemplo non é compatible con todos os navegadores, aínda que existen variacións sintácticas para Internet Explorer, Opera, Safari, e navegadores baseados en Mozilla.

Tamén é posible usar elementos <iframe> ocultos para solicitar os datos de maneira asíncrona, ou usar peticións <form target="url_to_cgi_script" />. Estes métodos eran os máis habituais antes do advenimiento do uso xeneralizado de XMLHttpRequest.

Hai unha biblioteca para o framework .NET que exporta clases .NET coa sintaxe de JSON para a comunicación entre cliente e servidor, en ambos os sentidos.

Exemplo de JSON

A continuación móstrase un exemplo simple de definición de barra de menús usando JSON e XML.

JSON:

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

XML:

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

Aínda que os defensores de JSON a miúdo notan que este é máis abreviado que XML, obsérvese que os dous exemplos teñen uns 190 caracteres cando se eliminan os espazos en branco. Ademais, o uso de compresión GZIP para enviar os datos ao navegador pode reducir a diferenza de tamaños entre ambos os formatos. De feito, cando se usa GZIP sobre os exemplos anteriores o exemplo en XML é máis pequeno por 6 bytes. Aínda que isto non é concluínte, mostra que é necesario experimentar co conxunto de datos a tratar para determinar que formato será máis eficiente en termos de tamaño. JSON non é sempre máis pequeno que XML.

O beneficio de JSON, entón, non é que sexa máis pequeno á hora de transmitir, senón que representa mellor a estrutura dos datos e require menos codificación e procesamiento.

Comparación con XML e outras linguaxes de marcado

XML goza de maior soporte e ofrece moitas máis ferramentas de desenvolvemento (tanto no lado do cliente como no lado do servidor). Hai moitos analizadores JSON no lado do servidor, existindo polo menos un analizador para a maioría das contornas. Nalgunhas linguaxes, como Xava ou PHP, hai diferentes implementaciones onde escoller. En JavaScript, a análise é posible de maneira nativa coa función eval(). Ambos os formatos carecen dun mecanismo para representar grandes obxectos binarios.

Con independencia da comparación con XML, JSON pode ser moi compacto e eficiente se se usa de maneira efectiva. Por exemplo, a aplicación DHTML de procura en BarracudaDrive recibe as listaxes de directorio como JSON desde o servidor. Esta aplicación de procura está permanentemente consultando ao servidor por novos directorios, e é notablemente rápida, mesmo sobre unha conexión lenta.

As contornas no servidor normalmente requiren que se incorpore unha función ou obxecto analizador de JSON. Algúns programadores, especialmente os familiarizados coa linguaxe C, atopan JSON máis natural que XML, pero outros desarrolladores atopan a súa concisa notación algo confusa, especialmente cando se trata de datos fortemente jerarquizados ou aniñados moi profundamente.

Hai máis comparacións entre JSON e XML nesta páxina de exemplo (en inglés).

YAML é un superconjunto de JSON que trata de superar algunhas das limitacións deste. Aínda que é significativamente máis complexo ([1]), aínda pode considerarse como lixeiro. A linguaxe de programación Ruby utiliza YAML como o formato de serialización por defecto. Así pois, é posible manexar JSON con bastante sinxeleza.


Véxase tamén

Referenzas

  1. Yahoo!. "Using JSON with Yahoo! Web services".  Parámetro descoñecido |fechaacceso= ignorado (suxírese |data-acceso=) (Axuda)

Ligazóns externas


Tutoriais
Implementacións
  • JSON Módulos Perl en CPAN (en inglés)
  • JSON Formatter, Programa pra dar formato e validar JSON online (en inglés)
  • qdfoxJSON, Implementación de JSON pra Visual FoxPro 6.0 o superior