Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion...

39
Hands on JSON © 2019 Syncro Soft SRL. All rights reserved. Octavian Nadolu, Syncro Soft [email protected] @OctavianNadolu

Transcript of Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion...

Page 1: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

© 2019 Syncro Soft SRL. All rights reserved.

Octavian Nadolu, Syncro [email protected]@OctavianNadolu

Page 2: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Software Architect at Syncro Soft

[email protected]• 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

Page 3: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Agenda● JSON Documents Structure

● Validating JSON Documents

● Querying and Transforming JSON Documents

● Converting JSON Documents

Page 4: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

JSON(JavaScript Object Notation) ● Data representation format● Used for API and Configs● Lightweight and easy to read/write

http://json.org

Page 5: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

JSON Documents Structure● JSON Data – name/value pair● JSON Object {...}● JSON Array [...]

Page 6: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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”

Page 7: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Value{...}, [...], 2, "one", true, null

Page 8: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Object{”firstname”: ”Jane”, ”lastname": ”Doe”}

Page 9: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Array[{”firstname”: ”Jane”, ”lastname": ”Doe”},

{”firstname”: ”John”, ”lastname": ”Jones”}]

Page 10: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Example{ "persons": [ { "id": "jane.doe", "firstname": "Jane", "lastname": "Doe", "email": "[email protected]", "age": 37 }, { "id": "john.jones", "firtname": "John", "lastname": "Jones", "email": "[email protected]", "age": 42 } ]}

ObjectArray

Property

Value

Page 11: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 12: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Checking Well-FormednessCheck if the JSON document respects the JSON specification

{ "id": "jane.doe", "firstname": "Jane", "lastname": "Doe", "email": "[email protected]", "age": 37 }

ECMA-404 The JSON Data Interchange Standard

http://json.org/

Page 13: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Example{ "persons" [ { "id": "jane.doe", "firstname": "Jane", "lastname": "Doe", "email": "[email protected]" "age": 37, }, { "id": "john.jones, "firtname": "John", "lastname": "Jones", "email": "[email protected]", "age": 42 ]}

Expected ',' character

Unexpected ',' character

Expected a ':' after a key

Expected quotes

Expected '}'

Page 14: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

JSON SchemaJSON Schema is a vocabulary that allows you to annotate and validate JSON documents

http://json-schema.org

Page 15: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 16: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

ExampleJSON Schema

{ "type": "object", "properties": { "persons": { "type": "array" } } }}

JSON Instance

{ "persons": [ ]}

Page 17: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

ExampleJSON 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": "[email protected]", "age": 37} ]}

Page 18: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 19: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Validating with JSON Schema● Check if the JSON instance respects the definitions

{ "persons": [ { "id": 2, "firstname": "Jane", "familyname": "Doe", "email": "[email protected]", "age": 37e } ]}

Invalid email address

Expected string, but fund integer

Required key [lastname] not found[familyname] is not permitted

Page 20: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 21: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Validating JSON Schema ● Check for well-formedness● Validate accordingly to the Internet Engineering Task Force

(IETF) Specification

Page 22: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Validating JSON with Schematron● Specify the JSON structure using JSON Schema● Express co-constraints and define custom rules using

Schematron

Page 23: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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>

Page 24: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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" } ] }]

Page 25: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Querying and Transforming

● Query using JSON Pointer, JSONiq, or XPath

● Transform JSON using JavaScript, XSLT, XQuery

Page 26: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

JSON PointerUsed to identify a specific value within a JSON document

#/persons/0/emailMatches first person email

Specification

https://tools.ietf.org/html/rfc6901

Page 27: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

JSONiqA query and processing language for JSON

www.jsoniq.org

Page 28: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

XPath● Powerful language for queering XML documents ● Was adopted by applications also for JSON

/persons[2]/emailMatches second person email

Page 29: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 30: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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()?

Page 31: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Converting JSON Documents● JSON to XML and XML to JSON● Convert using XSLT● Online Converters

Page 32: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

JSON to XML{ "personnel": { "person": [ { "id": 1, "name": { "family": "Worker", "given": "One" }, "email": "[email protected]", "link": {"manager": "Big.Boss"} }, { "id": 2, "name": { "family": "Worker", "given": "Two" }, "email": "[email protected]", "link": {"manager": "Big.Boss"} } ] }}

<personnel> <person> <id>1</id> <name> <family>Worker</family> <given>One</given> </name> <email>[email protected]</email> <link> <manager>Big.Boss</manager> </link> </person> <person> <id>2</id> <name> <family>Worker</family> <given>Two</given> </name> <email>[email protected]</email> <link> <manager>Big.Boss</manager> </link> </person></personnel>

Page 33: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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>

Page 34: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

1

XML to JSON

<personnel> <person id="1"> <name> <family>Worker</family> <given>One</given> </name> <email>[email protected]</email> <link manager="harris.anderson"/> </person> <person> <id>2</id> <name> <family>Worker</family> <given>Two</given> </name> <email>[email protected]</email> <link manager="harris.anderson"/> </person></personnel>

{ "personnel": { "person": [ { "id": 1, "name": { "family": "Worker", "given": "One" }, "email": "[email protected]", "link": {"manager": "harris.anderson"} }, { "id": 2, "name": { "family": "Worker", "given": "Two" }, "email": "[email protected]", "link": {"manager": "harris.anderson"} } ] }}

Page 35: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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": "!"}

Page 36: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 37: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Hands on JSON

Online Converter● Online XML to JSON Converters

Convert between XML and JSON

Page 38: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

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

Page 39: Hands on JSON › events › 2019 › Tekom_2019 › ... · Hands on JSON JSON to XML Conversion Details A  element is added as root if the converted JSON has multiple

Questions?

Octavian NadoluSoftware Architect at Syncro Soft

[email protected]: @OctavianNadolu

LinkedIn: octaviannadolu

https://sundt01.honestly.de