JSON

Eine Einführung


7.1.2016 / TUSTEP-Tagung Blaubeuren

immanuel.normann@pagina-online.de


[Leertaste für nächste Folie]

JSON

							
{
  "Urheber":"Douglas Crockford",
  "Jahr": 1999,
  "Standards": [
  	"RFC 7159",
  	"ECMA 404"
  ]
}
							
						

Die JavaScript Object Notation, kurz JSON, ist ein kompaktes Datenformat in einer einfach lesbaren Textform zum Zweck des Datenaustauschs zwischen Anwendungen.

JSON Grammatik

Es gibt zwei Typen von Konstrukten: Komplexe und Literale

Literale
sind nicht weiterzerlegbar
Zeichenkette, Zahl, Wahrheitswert, null
Komplexe Konstrukte
setzen sich aus komplexen Konstrukten oder Literalen zusammen
Objekt, Array
(siehe auch: json.org)

JSON Grammatik

Objekt

{Eigenschaften}
					

JSON Grammatik

leeres Objekt

{}
					

JSON Grammatik

Objekt

{
  Eigenschaft-1,
  Eigenschaft-2,
  ...
}
					

JSON Grammatik

Objekt

{
  Schlüssel-1:Konstrukt-1,
  Eigenschaft-2,
  ...
}
					

JSON Grammatik

Objekt

{
  Schlüssel-1:Konstrukt-1,
  Schlüssel-2:Konstrukt-2,
  ...
}
					

JSON Grammatik

Array

[Konstrukte]
					

JSON Grammatik

leeres Array

[]
					

JSON Grammatik

Array

[Konstrukt-1,Konstrukt-2,...]
					

JSON Grammatik

Array

[Konstrukt-1,Konstrukt-2,...]
					

JSON Beispiel

Objekt
					
{
  Schlüssel-1:Konstrukt-1,
  Schlüssel-2:Konstrukt-2,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":Konstrukt-1,
  Schlüssel-2:Konstrukt-2,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":Zeichenkette,
  Schlüssel-2:Konstrukt-2,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  Schlüssel-2:Konstrukt-2,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":Konstrukt-2,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":Zahl,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  Schlüssel-3:Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":Konstrukt-3,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":Wahrheitswert,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  Schlüssel-4:Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":Konstrukt-4,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":Array,
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":[Zeichenkette-1,Zeichenkette-2],
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":["Mathematik","Geometrie"],
  Schlüssel-5:Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":["Mathematik","Geometrie"],
  "Autoren":Konstrukt-5
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":["Mathematik","Geometrie"],
  "Autoren":Array
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":["Mathematik","Geometrie"],
  "Autoren":[Objekt-1,Objekt-2]
}
						
{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":["Mathematik","Geometrie"],
  "Autoren":[
        {
            "Vorname": "David",
            "Nachname": "Hilbert"
        },
        {
            "Vorname": "Paul",
            "Nachname": "Bernays"
        }
    ]
}
						

JSON Beispiel 2

{
    "Vorname": "Friedrich",
    "Nachname": "Schiller",
    "Dramen": [
        {
            "Titel": "Die Räuber",
            "Jahr": 1781
        },
        {
            "Titel": "Maria Stuart",
            "Jahr": 1800
        }
    ],
    "Lyrik": [
        "Die Bürgschaft",
        "Der Handschuh",
        "Die Kraniche des Ibykus"
    ],
    "Romane": []
}
					

Anwendungsbereiche

Javascript
einlesen: JSON.parse(json_string)
serialisieren: JSON.stringify(json_obj)
Andere Programmiersprachen
s. json.org
NoSQL-Datenbanken
Konfigurationsdateien
.mozilla/firefox/.../extensions.json
.thunderbird/.../folderTree.json
Web-APIs
linking open bibliographic data
geonames
correspsearch
culturegraph
WuN Benjamin-Online
programmableweb

JSON / XML

Eine Gegenüberstellung

Warum ist das interessant?

XML (TEI/XML)
Auszeichnungssprache für Texte
Format für Langzeitarchivierung
Textretrieval mit XML-Datenbanken
JSON
Bevorzugtes Datenaustauschformat für Webanwendungen
Ideales Zusammenspiel mit Javascript
Javascript: Einzige Skriptsprache, die in allen Browsern läuft
XML/JSON-Konfikt:
Webseiten präsentieren Inhalte in HTML (→ XML)
Interaktionen und Datenaustausch wird in Javascript (→ JSON) implementiert

Gibt es eine 1:1-Transformation zwischen JSON und XML?

JSON / XML

{
  "Titel":"Grundlagen der Geometrie",
  "Jahr":1966,
  "digitalisiert":false,
  "Schlagworte":["Mathematik","Geometrie"],
  "Autoren":[
        {
            "Vorname": "David",
            "Nachname": "Hilbert"
        },
        {
            "Vorname": "Paul",
            "Nachname": "Bernays"
        }
    ]
}
{                                               <Buch>
  "Titel":"Grundlagen der Geometrie",             <Titel>Grundlagen der Geometrie</Titel>
  "Jahr":1966,                                    <Jahr>1966</Jahr>
  "digitalisiert":false,                          <digitalisiert>false</digitalisiert>
  "Schlagworte":["Mathematik","Geometrie"],       <Schlagworte>Mathematik,Geometrie</Schlagworte>
  "Autoren":[                                     <Autoren>
        {                                           <Autor>
            "Vorname": "David",                       <Vorname>David</Vorname>
            "Nachname": "Hilbert"                     <Nachname>Hilbert</Nachname>
        },                                          </Autor>
        {                                           <Autor>
            "Vorname": "Paul",                        <Vorname>Paul</Vorname>
            "Nachname": "Bernays"                      <Nachname>Bernays</Nachname>
        }                                           </Autor>
    ]                                             <Autoren>
}                                               </Buch>

JSON / XML

JSON gilt als leichtgewichtiges Format.

XML gilt demgegenüber als schwergewichtig.

Was soll das heißen?

(s.a. JSON: The Fat-Free Alternative to XML)

JSON / XML

<Buch>
    <Titel>Grundlagen der Geometrie</Titel>
    <Jahr>1966</Jahr>
    <digitalisiert>false</digitalisiert>
    <Schlagworte>Mathematik,Geometrie</Schlagworte>
    <Autoren>
        <Autor>
            <Vorname>David</Vorname>
            <Nachname>Hilbert</Nachname>
        </Autor>
        <Autor>
            <Vorname>Paul</Vorname>
            <Nachname>Bernays</Nachname>
        </Autor>
    </Autoren>
</Buch>
						
<Buch>
    <Titel>Grundlagen der Geometrie</Titel>
    <Jahr>1966</Jahr>
    <digitalisiert>false</digitalisiert>
    <Schlagworte>Mathematik,Geometrie</Schlagworte>
    <Autoren>
        <Autor>
            <Vorname>David</Vorname>
            <Nachname>Hilbert</Nachname>
        </Autor>
        <Autor>
            <Vorname>Paul</Vorname>
            <Nachname>Bernays</Nachname>
        </Autor>
    </Autoren>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte>Mathematik,Geometrie</Schlagworte>
    <Autoren>
        <Autor>
            <Vorname>David</Vorname>
            <Nachname>Hilbert</Nachname>
        </Autor>
        <Autor>
            <Vorname>Paul</Vorname>
            <Nachname>Bernays</Nachname>
        </Autor>
    </Autoren>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte>Mathematik,Geometrie</Schlagworte>
    <Autoren>
        <Autor>
            <Vorname>David</Vorname>
            <Nachname>Hilbert</Nachname>
        </Autor>
        <Autor>
            <Vorname>Paul</Vorname>
            <Nachname>Bernays</Nachname>
        </Autor>
    </Autoren>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte>Mathematik,Geometrie</Schlagworte>
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte>Mathematik,Geometrie</Schlagworte>
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte>
    	<Schlagwort>Mathematik</Schlagwort>
    	<Schlagwort>Geometrie</Schlagwort>
    </Schlagworte>
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte>
    	<Schlagwort>Mathematik</Schlagwort>
    	<Schlagwort>Geometrie</Schlagwort>
    </Schlagworte>
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true" xmlns="urn:example:open-bib">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte xmlns="urn:example:open-thesaurus">
    	<Schlagwort>Mathematik</Schlagwort>
    	<Schlagwort>Geometrie</Schlagwort>
    </Schlagworte>
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true" xmlns="urn:example:open-bib">
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte xmlns="urn:example:open-thesaurus">
    	<Schlagwort>Mathematik</Schlagwort>
    	<Schlagwort>Geometrie</Schlagwort>
    </Schlagworte>
    <!-- TODO: Verlag ergänzen! -->
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true" xmlns="urn:example:open-bib">
<?print center?>
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte xmlns="urn:example:open-thesaurus">
    	<Schlagwort>Mathematik</Schlagwort>
    	<Schlagwort>Geometrie</Schlagwort>
    </Schlagworte>
    <!-- TODO: Verlag ergänzen! -->
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
<Buch Jahr="1966" digitalisiert="true" xmlns="urn:example:open-bib">
<?print center?>
    <Titel>Grundlagen der Geometrie</Titel>
    <Schlagworte xmlns="urn:example:open-thesaurus">
    	<Schlagwort>Mathematik</Schlagwort>
    	<Schlagwort>Geometrie</Schlagwort>
    </Schlagworte>
    <!-- TODO: Verlag ergänzen! -->
    <Autor>
        <Vorname>David</Vorname>
        <Nachname>Hilbert</Nachname>
    </Autor>
    <Autor>
        <Vorname>Paul</Vorname>
        <Nachname>Bernays</Nachname>
    </Autor>
</Buch>
						
Keine Entsprechung in JSON: Attribute, mehrfache Elemente, Namensräume, PIs, Kommentare

XML-JSON-Konvertierung

Die Leichtgewichtigkeit von JSON gegenüber XML besteht in fehlenden Entsprechungen!

XML-Konstrukte die es in JSON nicht gibt:
Attribute, mehrfache Elemente, Namensräume, Verarbeitungsanweisungen (PIs), Kommentare, Links, IDs und diverse Datentypen.

Generell: Um ein leichtgewichtiges Format in ein schwergewichtiges Format zu transformieren, muss die Transformation der fehlenden Konstrukte durch eine Transformationkonvention festgelegt werden.

Konvertierung von XML nach JSON

Es gibt nicht die eine Konvertierungskonvention!

Namentlich populäre Konvertierungskonventionen:
badgerfish, rabbitfish, rayfish.

Diese werden von XSLTJSON unterstützt.

Konvertierung von JSON nach XML und zurück

XQJSON ist ein in XQuery implementierter Konverter, der eine verlustfreie Konvertierung von JSON nach XML und zurück ermöglicht:

$json eq xqjson:serialize-json(xqjson:parse-json($json))

JSON Schema

JSON-Schema hat die analoge Funktion für JSON, wie XML-Schema für XML.

Damit ist es möglich für JSON-Objekte ein Schema zu definieren.

JSON Repräsentationsformate

HAL, Collection, Siren und JSON-LD im Vergleich

Hypertext Application Language

Content-Type: application/hal+json

Reservierte Eigenschaften:

  • _link: Hyperlinks
  • _embedded: eingebettete Resourcen

Hypertext Application Language

							
{
    "Titel": "Grundlagen der Geometrie",
    "Jahr": 1966,
    "digitalisiert": true,
    "_links": {
        "self": {"href": "/book/123"},
        "Schlagworte": [
            {"href": "/keywords/mathematik"},
            {"href": "/keywords/geometrie"}
    ]},
    "_embedded": {"Autoren": [
        {"Vorname": "David", "Nachname": "Hilbert"},
        {"Vorname": "Paul", "Nachname": "Bernays"}
    ]}
}
							
						

Collection

Content-Type: application/collecttion+json

Reservierte Eigenschaften:

  • collection: Liste von Resourcen
  • data: eingebettete Resourcen
  • name, value: Eigenschaft eingebetteter Resourcen
  • links: Verknüpfung zu einer Resource
  • rel, href: Typ und URI des Links

Collection

							
{
    "href": "https://api.example.com/books/1234567890",
    "data": [
          {"name": "Titel", "value": "Grundlagen der Geometrie"},
          {"name": "Jahr", "value": 1966},
          {"name": "digitalisiert", "value": true}
    ],
    "links": [
        {"rel": "Schlagwort", "href": "/keywords/mathematik"},
        {"rel": "Schlagwort", "href": "/keywords/geometrie"},
        {"rel": "Autor", "href": "/persons/hilbert"},
        {"rel": "Autor", "href": "/persons/Bernays"}
    ]
}
							
						

Siren

Content-Type: application/vnd.siren+json

Siren a hypermedia specification for representing entities

Reservierte Eigenschaften:

  • class: Klassenzugehörigkeit des Objekts
  • properties: Eigenschaften
  • links: Verknüpfung zu einer Resource
  • rel, href: Typ und URI des Links
  • entities: eingebettete Resourcen
  • rel: Relationstyp zwischen Objekt und eingebetetter Resource

Siren

							
{
  "class": [ "Buch" ],
  "properties": { 
      "Titel": "", 
      "Jahr": 1966,
      "digitalisiert": true
  },
    "links": [
        {"rel": "Schlagwort", "href": "/keywords/mathematik"},
        {"rel": "Schlagwort", "href": "/keywords/geometrie"}
    ],
  "entities": [
    {
      "class": [ "Person" ],
      "rel": [ "Autor" ], 
      "properties": {"Vorname": "David","Nachname": "Hilbert"},
      "links": [{ "rel": [ "self" ], "href": "/persons/hilbert" }]
    },
    {
      "class": [ "Person" ],
      "rel": [ "Autor" ], 
      "properties": {"Vorname": "Paul","Nachname": "Bernays"},
      "links": [{ "rel": [ "self" ], "href": "/persons/Bernays" }]
    }
  ]
}
							
						

JSON-LD

Content-Type: application/ld+json

Eine JSON-basierte Serialisierung von Linked-Data

W3C Recommendation
Anwendungsgebiete
linking open bibliographic data (Bsp.: Faust)
culturegraph

Vielen Dank für Ihre Aufmerksamkeit!

Fragen? Anregungen?


Immanuel Normann / pagina GmbH, Tübingen (www.pagina-online.de)

immanuel.normann@pagina-tuebingen.de