alternativas a xml json, yaml, sxml, csv,...
TRANSCRIPT
Alternativas a XMLJSON, 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:
Lista oficial: http://www.iana.org/assignments/media-types
text/html: Página Web en formato HTMLtext/xml, application/xml : Documento XMLapplication/json: Documento JSONapplication/pdf: Fichero PDFimage/jpeg: Imagen JPEGapplication/rdf+xml: Documento RDFtext/csv: Documento CSVtext/turtle: Documento Turtle. . .
Alternativas a XML
Varias alternativas a la sintaxis XML
JSON
YAML
SXML
CSV
RDF
JSON
JSON = Javascript Object NotationSubconjunto de Javascript para representar datos
Independiente de lenguaje y fácil de analizarEstandarizado: 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
Editores JSON: http://www.jsoneditoronline.org/http://braincast.nl/samples/jsoneditor/
{ "pedido": { "fecha": "2017-05-29","productos": [ { "codigo" : "R23" ,
"nombre" : "Rotulador","cantidad" : 20
},{ "codigo" : "G56" ,
"nombre" : "Grapadora","cantidad" : 2
}]
}}
JSON: Valores básicos
Cadenas de caracteresCaracteres UnicodeDentro de comillas dobles.
"Juan" "Año"
NúmerosEnteros, reales
Booleanos true false
Null
JSON: Valores compuestos
Objetos Asociaciones de tipo clave : valorEntre llaves { }Ejemplo:
{ "nombre" : "Juan" , "edad" : 23 }
ArraysSecuencias de valoresPueden ser de diferentes tiposEntre corchetes [ ]
[2, "tres", true]
Objetos y arrays pueden anidarse
{ "pedido": { "fecha": "2017-05-29","productos": [ { "codigo" : "R23" ,
"nombre" : "Rotulador","cantidad" : 20
},{ "codigo" : "G56" ,
"nombre" : "Grapadora","cantidad" : 2
}]
}}
JSON. Estructura jerárquica
Documentos JSON tienen estructura de árbol
"pedido"
"productos""fecha"
"2017-05-29"0 1
"código""nombre"
"cantidad"
"G56" "Grapadora" 2
"código""nombre"
"cantidad"
"R23" "Rotulador" 20
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 SchemaPermite 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
VentajasAnalizador de JSON puede ser más eficienteFacilidad de procesamiento
Utilización en muchas APIs
Legibilidad similar a XML
RetosValidació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 datosObjetivos:
Facilidad de edición manualRepresentación de tipos de datos habituales en lenguajesIndependiente del lenguajeIncluye 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"}
}
Estilo en línea
Idéntico a JSON
Estilo basado
en indentación
Evita comillas, llaves y
corchetes
---pedido:
producto:- codigo : R23 nombre : Rotulador RX2cantidad : 20comentarios : Comprobad que escriben
producto:- codigo : G56 nombre : Grapadora Lincantidad : 2comentarios : 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: &id001nombre : Queso Cabralestipo: Quesocantidad: !!integer 1
Edam: <<: *id001nombre : Queso Edam
---ingredientes:
Cabrales: &id001nombre : Queso Cabralestipo: Quesocantidad: !!integer 1
Edam: nombre : Queso Edamtipo: Quesocantidad: !!integer 1
YAML. Comparación con XML
VentajasLegibilidad para edición manual
ProblemasEspacios de nombresValidación (Kwalify)Cortar/pegar manteniendo indentación
SXML
SXML: Scheme & XMLRepresentar XML mediante S-ExpresionesS-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 ValuesFormato muy popular hojas de calculo y bases de datos
Utilizado desde 1967Se popularizó sin especificación estándarCSV on the Web (CSVW): para añadir metadatos
Ejemplo:
codigo, nombre, cantidad, comentariosR23, Rotulador, 20, Comprobad que escribenG56, Grapadora, 2, Envuelta para regalo
CSV on the WebPermite 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, comentariosR23, Rotulador, 20, Comprobad que escribenG56, 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 RDFprefix 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
: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 .
<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}
JSON-LDRepresentació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ónTecnología
Validación TransformaciónConsulta
Modelo de datos
XML DTDsXML SchemaRelaxNGSchematron
XPathXQuery
ÁrbolContenido mixto
Texto/etiquetasElementos ordenadosAtributos no ordenados
JSON JSON Schema
JSonPath ÁrbolObjetos: clave/valor no ordenadosArrays: contenido ordenado
CSV CSVW SQL TablaElementos ordenados
RDF ShExSHACL
SPARQL GrafoArcos no ordenadosUso de URIs para integraciónDatos enlazadosVarias sintaxis: Turtle, JSON-LD,...