JSON (la notación de objetos de JavaScript, que pronuncio "Jason" y que puede pronunciar como desee) es un formato de datos basado en texto diseñado para ser legible por los usuarios, ligero y fácil de transmitir entre un servidor y un cliente web. Su sintaxis se deriva de JavaScript, de ahí su nombre, pero se puede usar en la mayoría de los idiomas, incluidos AS3 y C #.
Si has programado mucho, te habrás encontrado con matrices antes: colecciones de elementos, cada uno asignado a un entero específico.
En JSON, una matriz de las primeras seis letras del alfabeto se representaría así:
["a B C D e F"]
Los codificadores AS3 y JavaScript encontrarán el listado anterior muy familiar. Es similar a la forma en C # de definir una matriz, también.
Como probablemente pueda adivinar, los corchetes dicen "esto es una matriz", y las comas se usan para separar diferentes elementos (tenga en cuenta que no hay una coma después del elemento final). Suponiendo que el idioma en el que se analiza JSON utiliza matrices basadas en cero (y cuántos idiomas no hacer, estos días?), el elemento 0 será "a", 1 será "b", 2 será "c", y así sucesivamente.
Para hacer que los arreglos sean más fáciles de leer, a menudo los escribiremos con nuevas líneas adicionales y sangría:
[ "a B C D e F" ]
Tenga en cuenta que todavía no hay una coma después del elemento final, por lo que ahora parece un poco extraño.
No tenemos que usar cadenas como los elementos de una matriz JSON; también podemos usar números, cierto
, falso
, y nulo
. No hay una escritura estricta, lo que significa que puede mezclar los tipos de valores que usa en cualquier matriz. Por ejemplo, esto es perfectamente válido:
["manzana", 3, 912, nulo, -7.2222202, "#", verdadero, falso]
Tenga en cuenta que debe utilizar comillas dobles ("
) para rodear todas tus cuerdas; comillas simples ('
) no están permitidos. Sí, este es el caso, aunque JavaScript le permite incluir cadenas en cualquier tipo de cita. Si desea utilizar comillas dobles dentro de las cadenas JSON, use \ "
en lugar.
Una matriz es una colección de elementos donde cada uno se asigna a un entero específico. Un objeto es una colección de elementos donde cada uno se asigna a un determinado cuerda. Los artículos se llaman valores, y las cuerdas utilizadas para identificarlas se llaman llaves. Algunos lenguajes de programación llaman a este tipo de estructura de datos una tabla de picadillo o mapa hash.
Podríamos representar las edades de las personas en un objeto como este:
"Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie": 58
Las llaves de rizo dicen "esto es un objeto" y, al igual que con las matrices, las comas separan los diferentes elementos. Sin embargo, los elementos se dan en pares, esta vez. Es más fácil ver si agregamos algunas líneas nuevas y sangría:
"Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie": 58
En cada par, dos puntos separan la clave (que es una cadena) del valor (que, en este caso, es un número). Cuando creamos una matriz, no tuvimos que especificar a qué número entero se asignó cada elemento (es decir, solo necesitábamos especificar los valores y no las claves), ya que se asignaron en función del orden en que se escribieron. la matriz.
En lugar de solicitar el segundo o quinto elemento, como lo haría al acceder a una matriz, con un objeto solicitará el elemento "Alan" o "Eliza".
Para hacer las cosas más confusas, los objetos también le permiten usar cadenas como valores, no solo las claves. Para que puedas tener un objeto como este:
"Activetuts +": "http://active.tutsplus.com/", "Psdtuts +": "http://psd.tutsplus.com/", "Nettuts +": "http://net.tutsplus.com/ "," Aetuts + ":" http://ae.tutsplus.com/ "," Vectortuts + ":" http://vector.tutsplus.com/ "," Audiotuts + ":" http://audio.tutsplus.com / "," Cgtuts + ":" http://cg.tutsplus.com/ "," Phototuts + ":" http://photo.tutsplus.com/ "," Webdesigntuts + ":" http: //webdesign.tutsplus. com / "," Mobiletuts + ":" http://mobile.tutsplus.com/ "
De esta manera, para recuperar la URL de un sitio de Tuts + determinado, puede solicitarlo usando el nombre del sitio como clave. Sin embargo, lo contrario no es cierto: no puede utilizar "http://cg.tutsplus.com/" para recuperar "Cgtuts +".
Las mismas reglas sobre diferentes tipos de citas se aplican a los objetos como a las matrices. Los objetos también pueden usar cadenas, números., cierto
, falso
, y nulo
como valores (pero solo cadenas como claves).
Los objetos y las matrices también pueden almacenar otros objetos y matrices. Esto nos permite crear estructuras de datos anidadas; por ejemplo:
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," hasPremium ": true," Nettuts + ": " url ":" http://net.tutsplus.com/ "," hasPremium ": true," Aetuts + ": " url ":" http: //ae.tutsplus.com/ "," hasPremium ": true," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," Audiotuts + ": "url": "http://audio.tutsplus.com/", "hasPremium": true, "Cgtuts +": "url": "http://cg.tutsplus.com/", "hasPremium" : true, "Phototuts +": "url": "http://photo.tutsplus.com/", "hasPremium": true, "Webdesigntuts +": "url": "http: //webdesign.tutsplus .com / "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium ": false
Veamos eso con un poco más de espacio en blanco:
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," hasPremium ": true," Nettuts + ": " url ":" http://net.tutsplus.com/ "," hasPremium ": true," Aetuts + ": " url ":" http: //ae.tutsplus.com/ "," hasPremium ": true," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," Audiotuts + ": "url": "http://audio.tutsplus.com/", "hasPremium": true, "Cgtuts +": "url": "http://cg.tutsplus.com/", "hasPremium" : true, "Phototuts +": "url": "http://photo.tutsplus.com/", "hasPremium": true, "Webdesigntuts +": "url": "http: //webdesign.tutsplus .com / "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium ": false
Cada objeto contiene dos campos: uno con la llave "url"
cuyo valor es una cadena que contiene la URL del sitio y otra con la clave hasPremium
cuyo valor es un booleano que es verdadero si el sitio tiene una sección Premium.
Sin embargo, no estamos restringidos a tener la misma estructura exacta para cada objeto en el JSON. Por ejemplo, podríamos agregar una URL adicional que apunte a la URL del programa Premium, pero solo para aquellos sitios que tienen una:
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "," Psdtuts + ": " url ":" http://psd.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium-program/psd- Premium / "," Nettuts + ": " url ":" http://net.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium-program/ net-Premium / "," Aetuts + ": " url ":" http://ae.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium- program / ae-Premium / "," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/ Premium-program / vector-Premium / "," Audiotuts + ": " url ":" http://audio.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http: // tutsplus. com / Premium-program / audio-Premium / "," Cgtuts + ": " url ":" http://cg.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http: // tutsplus.com/Premium-program/cg-Premium/ "," Phototuts + ": " url " : "http://photo.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/photo-Premium/", "Webdesigntuts +": " url ":" http://webdesign.tutsplus.com/ "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium ": false
Incluso podríamos incluir una serie de todos los últimos tutoriales Premium para un sitio determinado (solo mostraré Activetuts + aquí, y lo limitaré a algunos Premium, para ahorrar espacio):
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "" previousPremiums ": [" http://tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/create-a-space-shooter-game-in-flash-using- as3http: //tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/obscuring-and-revealing-scenes-with-as3http://tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ "," http://tutsplus.com/join / "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "hasPremium": false
Una matriz tiene sentido enumerar los Premium, porque estoy asumiendo que cualquier aplicación que realmente lea estos datos solo mostrará una lista de tutoriales Premium, en lugar de tener que acceder a ellos según su nombre, por lo que No es necesario asignarles cada uno una clave de cadena.
Podríamos llevar esto aún más lejos:
"Activetuts +": "url": "http://active.tutsplus.com/", "premium": "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program / active-Premium / "," previousPremiums ": [" title ":" Crear una aplicación de prueba de Flash personalizable "," url ":" http://tutsplus.com/join/ ",, " title ": "Crear un juego de Space Shooter en Flash con AS3", "url": "http://active.tutsplus.com/tutorials/games/create-a-space-shooter-game-in-flash-using-as3http:/ /tutsplus.com/join/ ",, " title ":" Ocultando y revelando escenas con AS3 "," url ":" http://active.tutsplus.com/tutorials/games/obscuring-and-revealing- scenes-with-as3http: //tutsplus.com/join/ ",, " title ":" Construyendo un motor dinámico de Shadow Shadow en AS3 "," url ":" http://active.tutsplus.com/tutorials /games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ ",, " title ":" Animando el Envcast Community Podcast "," url ":" http : //tutsplus.com/join/ "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "premium": "hasPremium": false
¡Uf! Si quisiéramos, podríamos crear objetos que contengan los nombres y las URL de perfil de cada autor de cada tutorial Premium. ¿Puedes descubrir la mejor manera de hacerlo??
Mantener arreglos dentro de arreglos también puede ser útil; Particularmente para juegos. Este podría ser el diseño actual de una tabla Tic-Tac-Toe:
[[1, 2, 0], [0, 1, 0] [0, 2, 1]]
¿No lo ves? Intenta eliminar algunos espacios en blanco:
[[1,2,0], [0,1,0], [0,2,1]]
1
no es nada, 2
es una cruz y 0
Es un espacio vacío. ¡Las nadas ganan! Y estoy seguro de que puedes ver cómo algo similar podría usarse para Battleships o Connect 4 o Minesweeper. Para obtener más información sobre matrices anidadas, consulte mi tutorial anterior.
Ya que JSON es tan popular, hay analizadores (herramientas y bibliotecas que decodifican un lenguaje de programación para que otro pueda entenderlo) y generadores (Herramientas y bibliotecas que hacen lo contrario; codifican un lenguaje de programación en otro) disponibles para la mayoría de los lenguajes de programación. Solo busca [JSON parser (nombre de tu idioma]. Voy a destacar algunos que son relevantes para los lectores de Activetuts +.
La biblioteca estándar para codificar y decodificar datos JSON en AS3 es as3corelib; Consulte mi guía sobre el uso de bibliotecas externas si no está seguro de cómo instalarlo..
Puede decodificar una cadena con formato JSON a objetos y matrices AS3 pasándola a com.adobe.serialization.json.JSON.decode ()
; el valor de retorno será una matriz o un objeto, según el JSON. Si pasas falso
como segundo argumento, el decodificador no seguirá el estándar JSON tan estrictamente, por lo que puede salirse con un formato más descuidado.
Puede codificar una matriz o objeto AS3 (que puede contener matrices y objetos anidados) en una cadena JSON pasándola a com.adobe.serialization.json.JSON.encode ()
; el valor de retorno será una cadena.
Se anunció que las futuras versiones de Flash incluirán el análisis JSON nativo, por lo que pronto no habrá necesidad de usar as3corelib para ese propósito..
Para analizar JSON, simplemente agregue una referencia a Sistema.json
. Entonces:
#using System.Json; descodificado = JsonValue.Parse (jsonString); // puede ser un JsonPrimitive, JsonArray o JsonObject, dependiendo del JSON aprobado
Codificar un objeto en una cadena JSON es un poco más complicado. Primero debe crear un contrato de datos para el tipo de objeto que desea codificar; Llamemos al nuestro Cosa
, y el objeto real mi cosa
. Entonces:
#using System.Runtime.Serialization.Json; MemoryStream myStream = new MemoryStream (); DataContractJsonSerializer jsonEncoder = new DataContractJsonSerializer (typeof (Thing)); jsonEncoder.WriteObject (myStream, myThing); myStream.Position = 0; StreamReader sr = new StreamReader (myStream); encoded = sr.ReadToEnd ();
También puede usar este método para decodificar una cadena JSON a una clase específica de objeto:
#using System.Runtime.Serialization.Json; myStream.Position = 0; myOtherThing = ser.ReadObject (myStream); // debes lanzar esto como Cosa
Para obtener más información, consulte las páginas de MSDN Trabajar con datos JSON y Cómo: Serializar y deserializar datos JSON.
Tú podría acaba de pasar la cadena JSON a eval ()
En JavaScript, pero este es un terrible riesgo de seguridad. La mayoría de los navegadores modernos soportan una función JSON.parse ()
, que analizará una cadena JSON en objetos JavaScript, y JSON.stringify ()
, que convertirá un objeto o matriz de JavaScript en una cadena JSON.
Douglas Crockford creó una biblioteca para hacer esto en navegadores más antiguos; está disponible en github.
Hay un conjunto de C # llamado LitJSON que puede usar en sus proyectos de Unity para analizar y generar JSON. Puede usar esto incluso si su proyecto está escrito en JavaScript o Boo en lugar de C #.
Para decodificar un objeto Unity a una cadena JSON:
#using LitJson; string jsonString = JsonMapper.ToJson (myObject);
Para codificar una cadena JSON a un objeto Unity de tipo Thing:
#using LitJson; Thing myThing = JsonMapper.ToObject(jsonString);
El manual de LitJSON es genial; Recomiendo leer eso para más orientación..
JSON.org tiene una larga lista de bibliotecas para diferentes plataformas e idiomas; además, puede buscar en Google, como se mencionó anteriormente;)
Ese sitio también tiene algunas grandes visualizaciones de cómo se puede construir JSON, y muchos detalles van más allá de lo que he explicado en esta rápida introducción. Échale un vistazo si quieres saber más.!