Hands on
JSON
© 2019 Syncro Soft SRL. All rights reserved.
Octavian Nadolu, Syncro Soft
octavian_nadolu@oxygenxml.com
@OctavianNadolu
Hands on JSON
Software Architect at Syncro Soft
octavian.nadolu@oxygenxml.com
• 15+ years of XML technology experience
• Contributor for various XML-related open source projects
• Editor of Schematron QuickFix specification developed by a W3C
community group
About me
Hands on JSON
Agenda
●
JSON Documents Structure
●
Validating JSON Documents
●
Querying and Transforming JSON Documents
●
Converting JSON Documents
Hands on JSON
JSON
(JavaScript Object Notation)
●
Data representation format
●
Used for API and Configs
●
Lightweight and easy to read/write
http://json.org
Hands on JSON
JSON Documents Structure
●
JSON Data – name/value pair
●
JSON Object {...}
●
JSON Array [...]
Hands on JSON
JSON Data
●
A collection of name/value pairs
●
The name in double quotes, followed by a colon, followed by a value
”firstname”: ”Jane”
Hands on JSON
Value
{...}, [...], 2, "one", true, null
Hands on JSON
Object
{”firstname”: ”Jane”, ”lastname": ”Doe”}
Hands on JSON
Array
[{”firstname”: ”Jane”, ”lastname": ”Doe”},
{”firstname”: ”John”, ”lastname": ”Jones”}]
Hands on JSON
Example
{
"persons": [
{
"id": "jane.doe",
"firstname": "Jane",
"lastname": "Doe",
"email": "jane@oxygenxml.com",
"age": 37
},
{
"id": "john.jones",
"firtname": "John",
"lastname": "Jones",
"email": "john@oxygenxml.com",
"age": 42
}
]
}
Object
Array
Property
Value
Hands on JSON
Validating JSON Documents
●
Checking Well-Formedness in JSON
Documents
●
Validating JSON Documents Against JSON
Schema
●
Validating JSON Schema According to the
Specification
Hands on JSON
Checking Well-Formedness
Check if the JSON document respects the JSON specification
{
"id": "jane.doe",
"firstname": "Jane",
"lastname": "Doe",
"email": "jane@oxygenxml.com",
"age": 37
}
ECMA-404 The JSON Data Interchange Standard
http://json.org/
Hands on JSON
Example
{
"persons" [
{
"id": "jane.doe",
"firstname": "Jane",
"lastname": "Doe",
"email": "jane@oxygenxml.com"
"age": 37,
},
{
"id": "john.jones,
"firtname": "John",
"lastname": "Jones",
"email": "john@oxygenxml.com",
"age": 42
]
}
Expected ',' character
Unexpected ',' character
Expected a ':' after a key
Expected quotes
Expected '}'
Hands on JSON
JSON Schema
JSON Schema is a vocabulary that
allows you to annotate and validate
JSON documents
http://json-schema.org
Hands on JSON
Defining JSON Schema
●
Similar to XML Schema, RNG, or DTD
●
Written in JSON
●
Used to define the structure of a JSON data
{”type”: ”string”}
JSON Schema
”I'm a string”
JSON Instance
Hands on JSON
Example
JSON Schema
{
"type": "object",
"properties": {
"persons": {
"type": "array"
}
}
}
JSON Instance
{
"persons": [ ]
}
Hands on JSON
Example
JSON Schema
{
"type": "object",
"properties": {
"persons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {"type": "string"},
"firstname": {"type": "string"},
"lastname": {"type": "string"},
"email": {"type": "string","format": "email"},
"age": {"type": "number"}
}
}
}
}
}
JSON Instance
{
"persons": [
{
"id": "jane.doe",
"firstname": "Jane",
"lastname": "Doe",
"email": "jane@oxygenxml.com",
"age": 37}
]
}
Hands on JSON
JSON Schema Definition
●
It is recommended to to have the schema definition on the
first level
"$schema": "http://json-schema.org/draft-07/schema#"
●
JSON Schema used versions:
– Draft 4
– Draft 6
– Draft 7
– Draft 8
Hands on JSON
Validating with JSON Schema
●
Check if the JSON instance respects the definitions
{
"persons": [
{
"id": 2,
"firstname": "Jane",
"familyname": "Doe",
"email": "jane@oxygenxml..com",
"age": 37
}
]
}
Invalid email address
Expected string, but fund integer
Required key [lastname] not found
[familyname] is not permitted
Hands on JSON
Associate JSON Schema
●
Associating a Schema to JSON Documents
– Directly in JSON document – using $schema property
– In application options
{
"$schema": "person-schema.json",
"persons" [ ... ]
}
Absolute or relative URI
Hands on JSON
Validating JSON Schema
●
Check for well-formedness
●
Validate accordingly to the Internet Engineering Task Force
(IETF) Specification
Hands on JSON
Validating JSON with Schematron
●
Specify the JSON structure using JSON Schema
●
Express co-constraints and define custom rules using
Schematron
Hands on JSON
Schematron for JSON
●
Use XPath to express the rules
<sch:rule context="persons">
<sch:assert test="number(age) > preceding-sibling::node()/age ">
The person age must be grater than the previous person age </sch:assert>
</sch:rule>
Hands on JSON
Schematron using JSONPath
●
Schematron reimagined for JSON with no whiff of
XML/XPath
●
Moved out of the XPath and use JSONPath
https://github.com/amer-ali/jsontron
"rule": [
{"context": "$.persons.*",
"assert": [
{"test": "(jp.query(contextNode,'$..age') >= 21",
"message": "The person age must be grater than 21"}
]
}
]
Hands on JSON
Querying and Transforming
●
Query using JSON Pointer,
JSONiq, or XPath
●
Transform JSON using
JavaScript, XSLT, XQuery
Hands on JSON
JSON Pointer
Used to identify a specific value within a JSON document
#/persons/0/email
Matches first person email
Specification
https://tools.ietf.org/html/rfc6901
Hands on JSON
JSONiq
A query and processing language for JSON
www.jsoniq.org
Hands on JSON
XPath
●
Powerful language for queering XML documents
●
Was adopted by applications also for JSON
/persons[2]/email
Matches second person email
Hands on JSON
Process JSON with JavaScript
●
Most popular way to process JSON documents
●
Multiple libraries
var json = '{"name":”John Doe”, "age":42}';
obj = JSON.parse(json);
console.log(obj.name); // Result John Doe
console.log(obj.age); // Result 42
Hands on JSON
Transform using XSLT/XQuery
●
Transform JSON Documents to Different Formats
●
Different functions to process JSON document:
●
json-doc($href as xs:string?) as item()?
●
json-to-xml($json-text as xs:string?) as document-node()?
Hands on JSON
Converting JSON Documents
●
JSON to XML and XML to JSON
●
Convert using XSLT
●
Online Converters
Hands on JSON
JSON to XML
{
"personnel": {
"person": [
{
"id": 1,
"name": {
"family": "Worker",
"given": "One"
},
"email": "one@oxygenxml.com",
"link": {"manager": "Big.Boss"}
},
{
"id": 2,
"name": {
"family": "Worker",
"given": "Two"
},
"email": "two@oxygenxml.com",
"link": {"manager": "Big.Boss"}
}
]
}
}
<personnel>
<person>
<id>1</id>
<name>
<family>Worker</family>
<given>One</given>
</name>
<email>one@oxygenxml.com</email>
<link>
<manager>Big.Boss</manager>
</link>
</person>
<person>
<id>2</id>
<name>
<family>Worker</family>
<given>Two</given>
</name>
<email>two@oxygenxml.com</email>
<link>
<manager>Big.Boss</manager>
</link>
</person>
</personnel>
Hands on JSON
JSON to XML Conversion Details
●
A <JSON> element is added as root if the converted JSON
has multiple properties on the first level
●
An <array> element is added as root if the converted JSON is
an array
[
{"name": "Boss"},
{"name": "Worker"}
]
<array>
<array>
<name>Boss</name>
</array>
<array>
<name>Worker</name>
</array>
</array>
{
"person": "one",
"id": "personnel-id"
}
<JSON>
<person>one</person>
<id>personnel-id</id>
</JSON>
Hands on JSON
1
XML to JSON
<personnel>
<person id="1">
<name>
<family>Worker</family>
<given>One</given>
</name>
<email>one@oxygenxml.com</email>
<link manager="harris.anderson"/>
</person>
<person>
<id>2</id>
<name>
<family>Worker</family>
<given>Two</given>
</name>
<email>two@oxygenxml.com</email>
<link manager="harris.anderson"/>
</person>
</personnel>
{
"personnel": {
"person": [
{
"id": 1,
"name": {
"family": "Worker",
"given": "One"
},
"email": "one@oxygenxml.com",
"link": {"manager": "harris.anderson"}
},
{
"id": 2,
"name": {
"family": "Worker",
"given": "Two"
},
"email": "two@oxygenxml.com",
"link": {"manager": "harris.anderson"}
}
]
}
}
Hands on JSON
XML to JSON Conversion Details
●
XML attributes are converted to properties
<person id="1"/> {"person": {"id": 1}}
●
Multiple elements with the same name are converted into
an array
<person/> <person/> "person": ["",""]
●
Text in mixed content will be converted in a #text property
<p>This is an <b>example</b>!</p> p": {"#text": "This is an","b": "example","#text1": "!"}
Hands on JSON
Convert using XSLT
●
Library that converts XML to JSON using XSLT
https://github.com/bramstein/xsltjson
XSLT Specification for JSON
http://www.w3.org/TR/xslt-30/#json
Hands on JSON
Online Converter
●
Online XML to JSON Converters
Convert between XML and JSON
Hands on JSON
Conclusion
●
JSON conforms to ECMA/ISO specification
●
Validate JSON with JSON Schema
●
Query and process JSON using JSON Pointer, JSONiq, XPath,
or JavaScript and XSLT
●
Conversions to convert between JSON and XML
Questions?
Octavian Nadolu
Software Architect at Syncro Soft
octavian.nadolu@oxygenxml.com
Twitter: @OctavianNadolu
LinkedIn: octaviannadolu
https://sundt01.honestly.de