Alternativas a XML JSON, YAML, SXML, CSV, RDF Jose Emilio Labra Gayo Depto. Informática Universidad de Oviedo
Tipos de representación Los tipos de representación se identifican con MIME MIME (Multipurpose Internet Mail Extensions) Identificar el tipo de contenido (Cabecera Content-type) Formato tipo/subtipo Ejemplos: text/html: Página Web en formato HTML text/xml, application/xml : Documento XML application/json: Documento JSON application/pdf: Fichero PDF image/jpeg: Imagen JPEG application/rdf+xml: Documento RDF text/csv: Documento CSV text/turtle: Documento Turtle... Lista oficial: http://www.iana.org/assignments/media-types
Alternativas a XML Varias alternativas a la sintaxis XML JSON CSV RDF YAML SXML
JSON JSON = Javascript Object Notation Subconjunto de Javascript para representar datos Independiente de lenguaje y fácil de analizar Estandarizado: RFD 4627 Librerías para múltiples lenguajes: C, C++, C#, Delphi, Haskell, Java, Lisp, Perl, PHP, Python, Ruby, Scheme, etc. http://json.org/ Douglas Crockford
JSON. Ejemplo { "pedido": { "fecha": "2017-05-29", "productos": [ { "codigo" : "R23", "nombre" : "Rotulador", "cantidad" : 20, { "codigo" : "G56", "nombre" : "Grapadora", "cantidad" : 2 ] Editores JSON: http://www.jsoneditoronline.org/ http://braincast.nl/samples/jsoneditor/
JSON: Valores básicos Cadenas de caracteres Caracteres Unicode Dentro de comillas dobles. "Juan" "Año" Números Enteros, reales Booleanos true false Null
JSON: Valores compuestos Objetos Asociaciones de tipo clave : valor Entre llaves { Ejemplo: { "nombre" : "Juan", "edad" : 23 Arrays Secuencias de valores Pueden ser de diferentes tipos Entre corchetes [ ] [2, "tres", true] Objetos y arrays pueden anidarse
JSON. Estructura jerárquica Documentos JSON tienen estructura de árbol { "pedido": { "fecha": "2017-05-29", "productos": [ { "codigo" : "R23", "nombre" : "Rotulador", "cantidad" : 20, { "codigo" : "G56", "nombre" : "Grapadora", "cantidad" : 2 ] "fecha" "2017-05-29" "pedido" "productos" 0 1 "código" "cantidad" "nombre" "código" "cantidad" "nombre" "R23" "Rotulador" 20 "G56" "Grapadora" 2
JSON. JSON en Javascript <script type="text/javascript" src="http://www.json.org/json.js"> </script> <script type="text/javascript"> x = [3, "tres"] alert("convertido en JSON: " + x.tojsonstring()) alert("analizando JSON...") str = "[4, \"cuatro\"]" r = str.parsejson() for (i=0; i < r.length; i++) { alert("elemento " + i + " = " + r[i]) </script>
JSON. Uso en Ajax var objeto; var htr = new XMLHTTPRequest(); htr.open("get",url,true); htr.send(null); htr.onreadystatechange = function () { if (htr.readystate == 4 ) { if (htr.status == 200) { objeto = eval("{" + htr.responsetext + "" ); else { alert("problema con la URL"); Problemas de seguridad al utilizar eval. Recomendación: Utilizar parsejson()
JSON Schema Permite validar documentos JSON Especificación en IETF: http://json-schema.org/ {"type": "object", "properties": { "pedido": { "type": "object", "properties": { "fecha": { "type": "string", "format": "date-time", "productos": { "type": "array", "minitems": 1, "items": { "type": "object", "properties": { "código": {"type": "string", "pattern": "[A-Z]\\d{2", "nombre": {"type": "string", "cantidad": { "type": "integer", "minimum": 1, "required": ["código", "cantidad" ], "required": ["fecha", "productos"] { "pedido": { "fecha": "2017-05-29", "productos": [ { "codigo" : "R23", "nombre" : "Rotulador", "cantidad" : 20, { "codigo" : "G56", "nombre" : "Grapadora", "cantidad" : 2 ]
JSON. Comparación con XML Ventajas Analizador de JSON puede ser más eficiente Facilidad de procesamiento Utilización en muchas APIs Legibilidad similar a XML Retos Validación: JSON Schema no es muy popular Espacios de nombres? Entidades?
YAML YAML (YAML Ain't a Markup Language) Propuesto por C. Evans (2001) como lenguaje para representar datos Objetivos: Facilidad de edición manual Representación de tipos de datos habituales en lenguajes Independiente del lenguaje Incluye JSON como un subconjunto
YAML. Ejemplo { "pedido": { "producto": [ "codigo" : "R23" ], "nombre" : "Rotulador RX2" "cantidad" : 20, "comentarios" : "Comprobad que escriben", { "producto": [ "codigo" : "G56" ], "nombre" : "Grapadora Lin" "cantidad" : 2, "comentarios" : "Envuelta para regalo" --- pedido: producto: Estilo basado en indentación Evita comillas, llaves y corchetes Estilo en línea Idéntico a JSON - codigo : R23 nombre : Rotulador RX2 cantidad : 20 comentarios : Comprobad que escriben producto: - codigo : G56 nombre : Grapadora Lin cantidad : 2 comentarios : Envuelta para regalo
YAML. Tipos de datos y Referencias Pueden definirse tipos de datos mediante!! Referencias &nombre: define un valor *nombre: referencia a un valor <<: Mezcla parejas de clave/valor --- ingredientes: Cabrales: &id001 nombre : Queso Cabrales tipo: Queso cantidad:!!integer 1 --- ingredientes: Cabrales: &id001 nombre : Queso Cabrales tipo: Queso cantidad:!!integer 1 Edam: <<: *id001 nombre : Queso Edam Edam: nombre : Queso Edam tipo: Queso cantidad:!!integer 1
YAML. Comparación con XML Ventajas Legibilidad para edición manual Problemas Espacios de nombres Validación (Kwalify) Cortar/pegar manteniendo indentación
SXML SXML: Scheme & XML Representar XML mediante S-Expresiones S-Expresiones: desarrolladas para LISP (y Scheme) LISP: Lenguaje funcional creado en 1958 (pedido (producto (@ (codigo "R23")) (nombre "Rotulador") (cantidad 20) (comentarios "Comprobad que escriben") ) (producto (@ (codigo "G56")) (nombre "Grapadora Lin") (cantidad 2) (comentarios "Envuelta para regalo") ) )
CSV CSV = Comma Separated Values Formato muy popular hojas de calculo y bases de datos Utilizado desde 1967 Se popularizó sin especificación estándar CSV on the Web (CSVW): para añadir metadatos Ejemplo: codigo, nombre, cantidad, comentarios R23, Rotulador, 20, Comprobad que escriben G56, Grapadora, 2, Envuelta para regalo
CSV on the Web Permite definir la estructura de ficheros CSV Incluye tipos de datos basados en XML Schema Herramienta: CSVLint { "fields": [ { "name": "Codigo", "constraints": { "required": true, "unique": true, { "name": "Nombre", "description": "Nombre del producto", "constraints": { "required": true, { "name": "Cantidad", "title": "Cantidad", "constraints": { "required": true, "type": "http://www.w3.org/2001/xmlschema#nonnegativeinteger", { "name": "Comentarios", "title": "Comentarios", "constraints":{ "required": true ] codigo, nombre, cantidad, comentarios R23, Rotulador, 20, Comprobad que escriben G56, Grapadora, 2, Envuelta para regalo
RDF Resource Description Framework Basado en grafo Declaraciones del tipo Sujeto - predicado - objeto Los predicados se identifican con URIs Sujetos: URIs o nodos anónimos Objetos: URIs, nodos anónimos ó literales
Ejemplo en RDF prefix schema: <http://schema.org/> prefix : <http://ejemplo.org/> prefix dbr: <http://dbpedia.org/resource/> :p1 a schema:order ; schema:orderdate "2017-05-29T23:00:00Z" ; schema:ordereditem :item1, :item2. :item1 a schema:product ; schema:identifier "R23" ; schema:name "Rotulador" ; schema:orderquantity 20 ; schema:sameas dbr:marker_pen. :item2 a schema:product ; schema:identifier "G56" ; schema:name "Grapadora" ; schema:orderquantity 2 ; schema:sameas dbr:stapler.
Validación de RDF Alternativas: Shape Expressions, SHACL <Order> { a [schema:order] ; schema:orderdate xsd:datetime ; schema:ordereditem @<Item>+ <Item> { schema:identifier xsd:string ; schema:name xsd:string ; schema:orderquantity xsd:integer; schema:sameas IRI :p1 a schema:order ; schema:orderdate "2017-05-29T23:00:00Z"; schema:ordereditem :item1, :item2. :item1 a schema:orderitem ; schema:identifier "R23" ; schema:name "Rotulador" ; schema:orderquantity 20 ; schema:sameas dbr:marker_pen. :item2 a schema:orderitem ; schema:identifier "G56" ; schema:name "Grapadora" ; schema:orderquantity 2 ; schema:sameas dbr:stapler.
JSON-LD Representación de RDF en JSON https://json-ld.org/ { "@context": "http://ejemplo.org/contexto.jsonld", "@graph": [ { "@id": ":p1", "productos": [ {"@id": ":item1", {"@id": ":item2" ], {"@id": ":item1", "codigo": "R23", "nombre": "Rotulador", "cantidad": 20, "ref": "dbr:marker_pen", {"@id": ":item2", "codigo": "G56", "nombre": "Grapadora", "cantidad": 2, "ref": "dbr:stapler" ] {"@context": "http://ejemplo.org/contexto.jsonld" { "": "http://ejemplo.org/", "schema": "http://schema.org/", "dbr": "http://dbpedia.org/resource/", "xsd": "http://www.w3.org/2001/xmlschema#", "productos": {"@id": "schema:orderitem", "nombre": { "@id": "schema:name", "codigo": {"@id": "schema:identifier", "cantidad": {"@id": "schema:orderquantity", "ref": {"@id": "schema:sameas",
Comparación Tecno logía Validación Transformación Consulta Modelo de datos XML DTDs XML Schema RelaxNG Schematron XPath XQuery Árbol Contenido mixto Texto/etiquetas Elementos ordenados Atributos no ordenados JSON JSON Schema JSonPath Árbol Objetos: clave/valor no ordenados Arrays: contenido ordenado CSV CSVW SQL Tabla Elementos ordenados RDF ShEx SHACL SPARQL Grafo Arcos no ordenados Uso de URIs para integración Datos enlazados Varias sintaxis: Turtle, JSON-LD,...