data and the webspiegel/en605681/webdata/data...xml overview • like html based on standard...

22
Principles of Enterprise Web Development Packaging Data for the Web EN 605.481

Upload: others

Post on 04-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Principles of Enterprise Web Development

Packaging Data for the Web

EN 605.481

Page 2: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Overview

• Both XML and JSON can be used to pass data between remote applications, clients and servers, etc.

• XML – Usually heavier than JSON

– More difficult to parse

• JSON – Readily parsed by Javascript

– Faster to process

Page 3: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

XML Overview

• Like HTML based on Standard Generalized Markup Language (SGML)

• XML allows arbitrary definition and use of tags and attributes • Well-formed for to faciliate parsing, search and manipulation

– XML documents have a single root tag that contains the remaining content

– Every open tag has a corresponding close tag that must match in name (including case)

– Tags are nested hierarchically – Attribute values must be quoted

• XML comprises many technologies – XML Schema – XSL/XSLT – Extensible Stylesheet Language/Transforms – Xpath – XML Path Language – Others

Page 4: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON Overview

• Self-describing format based on syntax used for Javascript objects

– ECMA-262 standard

• Completely language independent

– Easily integrated into Javascript

– Other languages provide supporting APIs (C/C++, Java, ASP, Python, Ruby…)

• Lightweight for rapid processing

Page 5: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

XML – JSON Example

<?xml version=“1.0”

encoding=“UTF-8”?>

<authors>

<name>

<firstname>Larry</firstname>

<lastname>Brown</lastname>

</name>

<name>

<firstname>Bob</firstname>

<lastname>Evans</lastname>

</name>

</authors>

235 bytes

{ authors: {

name: [

{

firstname:”Larry”,

lastname:”Brown”

},

{

firstname:”Bob”,

lastname:”Evans”

}

]

}}

146 bytes (38% smaller)

Page 6: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON versus XML

• While XML and JSON are both used for the exchange of data over the web, JSON is becoming the defacto format for exchanging data because: – More often JSON offers a more lightweight

representation that improves performance and processing

– Javascript’s built in mapping into objects make it easy to “export” and “import” data from/to the client

• XML as technology still has much to offer that is not available with JSON. For more information see: – Class “Additional Resources”

Page 7: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON Syntax

• Data is in name : value pairs (colon delimited) – Names are enclosed in double quotes – Values can be

• Integer or floating point numbers • Strings (enclosed in double quotes) • Boolean (true or false) • Arrays (enclosed in square brackets [] ) • Objects (enclosed in curly brackets {}) • null (all lowercase, represents empty type) • Whitespace (ignored)

• Data pairs are separated by commas • Curly brackets contain objects • Square brackets contain arrays

Page 8: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON Examples

• Name : Value Pair – “firstname” : “Richard” – “age” : 30

• Objects – {“firstname”:”Richard”, “lastname”:”Spiegel”, “age”:30 } – {“id”:88421, “Experience”:17, “Reviews:[8,5,7,4] } – {“InnerObject”: { “name”:”Spiegel”, “years”:”10”}, “level”:4}

• Arrays [ {“firstname”:”Richard”, “lastname”:”Spiegel”, “age”:30 } {“firstname”:”Brian”, “lastname”:”Spiegel”, “age”:20} {“firstname”:”Robert”, “lastname”:”Evand”, “age”:40 } ]

Page 9: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON Console

• Interactive Browser Consoles

– Chrome :

• ctrl+shift+j (cmd+shift+j for mac)

• Select Console tab

– Firefox

• About:blank in address bar for blank tab

• Tools->Web Developer->Web Console (ctrl+shift+k)

– IE

• F12

• Select console tab

• Other

– Firefox tool Scratchpad

– Jsbin.com

– Chrome extension JavaScript Editor

Page 10: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON and JavaScript

• Creating objects in Javascript – Empty object:

• var sampleObj = {};

– New object • var sampleObj = new Object();

– Initialized object: • var sampleObj = {“firstname”:”rich”,”age”:50};

– Array object: var sampleArray = { “directory” : [ {“firstname”:”rich”,”age”:35}, {“firstname”:”bob”,”age”:50}, {“firstname”:”emma”,”age”:12} ] };

Page 11: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON and JavaScript

• Accessing JSON object fields var x = sampleObj.firstname ; // x = “rich”

var y = sampleObj.age; // y = 50

• Accessing JSON array object fields var x = sampleArray.directory[2].firstname; // x = “emma”

var y = sampleArray.directory[0].age; // y = 35

var z = sampleArray.directory[1];

// z = {firstname:”bob”, age:50}

Page 12: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

JSON and Java

• Official standard API, JSR 353 – Java API for JSON Processing

– https://jcp.org/en/jsr/detail?id=353

• Several open source APIs existed prior to JSR 353 and are quite popular today – FasterXML/Jackson: https://github.com/FasterXML

– GSON: https://github.com/google/gson (Google)

– JSON-P: https://javaee.github.io/jsonp/

– JSON.org: http://www.json.org

– MOXy: https://wiki.eclipse.org/EclipseLink/FAQ/MOXy

Page 13: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

FasterXML/Jackson Overview

• Streaming API that parses and generates JSON in a series of events – Low overhead – Fast read/writes

• Tree model for loading and manipulating JSON document as Java objects (JsonNodes) – Most flexible for manipulation

• Data binding converts JSON to plain old Java objects (POJOs) using configurations or annotations and generates JSON from configured POJOs – Useful for serializing/deserializing Java Objects – Especially for web based application!

• Full documentation with tutorials and more at: https://github.com/FasterXML/jackson-docs

Page 14: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

FasterXML/Jackson Databinding • Getting and Installing

– Download from https://github.com/FasterXML • URLs provided to included in Maven builds • Links to jar files with library files, source code and api docs

– Three library jar files required for minimal access • jackson-core • jackson-databind • jackson-annotations

• API Usage – com.fasterxml.jackson.databind.ObjectMapper

• Primary class to facilitate the marshalling and unmarshalling of java objects to and from JSON

• Constructor and supporting methods

– com.fasterxml.jackson.core package • core classes used by databind package (aka ObjectMapper) • Exception classes thrown by class methods throughout Jackson

– com.fasterxml.jackson.annotations package • All supported annotations used for java class mapping to JSON formats • Helper classes that are used by ObjectMapper

Page 15: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

ObjectMapper

• Provides function of converting Java objects to JSON and vice versa

– Wraps other Jackson objects (from core library) for reading/writing JSON

• import com.fasterxml.jackson.databind.ObjectMapper • Constructor: new ObjectMapper() • Methods:

– readValue: several methods for moving data sources (streams, files, Strings) into Java objects • readValue(String content, Class<T> valueType) : deserializes JSON content into object of type

valueType

– writeValue: several methods for serializing Java objects into JSON output into Strings, files, streams • writeValueAsString : serializes Java object to String

– enable: methods for configuring the mapper for parsing JSON or generating JSON

• Exceptions – IOException – JsonGenerationException – JsonMappingException – JsonProcessingException – JsonParseException

Page 16: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Annotations

• Meta data to control how Java classes map to JSON documents and vice versa

• Added to either property or one of the accessor/mutator methods on that property

• Some have additional properties that can be set • @JsonProperty

– value: provides a name of the property in the JSON or just use name of java filed

– defaultValue: value for the property if one is not provided

• @JsonRootName – value: root name to use around object if root-level wrapping is

enabled

• @JsonIgnore • @JsonInclude • @JsonPropertyOrder

Page 17: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Using JSON with ReST

• The JAX-RS API (aka Jersey) interfaces with the JAX-B (JSON/XML binding) API inherently when necessary – JSON passed in conjunction with appropriate @Consumes

annotation will use JAX-B to deserialize JSON into objects. – Java objects passed in conjunction with appropriate

@Produces annotation will use JAX-B to serialize objects into JSON.

• Jersey projects must have a JAX-B implementation to support those API calls or they will fail – Will use default JAX-B API implementation packaged with

Jersey (MOXy) – Can replace MOXy with alternative JAX-B implementations

through library manipulation

Page 18: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

FasterXML/Jackson with ReST • FasterXML/Jackson libraries are required for processing

the underlying POJOs and JSON mappings – jackson-core – jackson-databind – jackson-annotations

• Need additional libraries that account for Jackson under the Java API for RESTful Web Services (JAX-RS) – jackson-jaxrs-base – jackson-jaxrs-json-provider

• Out of the box, Jersey provides another JAXB API (Moxy) that must be removed in order to use Jackson. – Remove jersey-media-moxy.jar file from classpath

Page 19: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Netbeans Project View

Default libraries provided by Jersey Library with jersey-media-moxy jar

file removed

Basic FasterXML/Jackson JAX-B libraries

FasterXML/Jackson libraries for use under JAX-RS

Page 20: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Using JSON Binding in ReST

• Create POJOs that will be mapped to desired JSON (and vice-versa) – Objects create from JSON passed from client

– JSON serialized from objects used on server

• Optionally, employ Jackson annotations on object to dictate mapping features (field names, order, etc)

• Employ the objects in ReST service methods as parameters or return variables in conjunction with @Produces/@Consumes annotations

Page 21: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Example JSON Output

• A ReST call to http://host/path..../record will return content of type application/json that will look as follows: {“first”:”rich”,”last”:”spiegel”,”age”:35}

@GET

@Path(“/record”)

@Produces(MediaType.APPLICATION_JSON)

public Record getRecord() {

Record r = new Record();

r.setFirstname(“Rich”);

r.setLastname(“Spiegel”);

r.setAge(35);

return r;

}

public class Record {

@JsonProperty(“first”)

private String firstname;

@JsonProperty(“last”)

private String lastname;

@JsonProperty(“age”)

private int age;

:

}

Page 22: Data and the Webspiegel/en605681/WebData/Data...XML Overview • Like HTML based on Standard Generalized Markup Language (SGML) • XML allows arbitrary definition and use of tags

Example JSON Input

• A POST to http://host/path..../new with attached JSON content will automatically create record and initialize it with fields from the JSON passed.

@POST

@Path(“/new”)

@Consumes(MediaType.APPLICATION_JSON)

public Response newRecord(Record record)

{

// record is initialized from the

// json content provided in the POST

// request

}

public class Record {

@JsonProperty(“first”)

private String firstname;

@JsonProperty(“last”)

private String lastname;

@JsonProperty(“age”)

private int age;

:

}