Java EE 8 What’s New on the JSON Front - RainFocus · JSON Support in Java EE 8 • JSON...

78

Transcript of Java EE 8 What’s New on the JSON Front - RainFocus · JSON Support in Java EE 8 • JSON...

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JavaEE8What’sNewontheJSONFrontCON7773

DavidDelabassée@delabasseeOracleOctober,2017

2

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 3

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

WhatisJSON?•  JavaScriptObjectNotaOon•  SubsetofJavaScript•  Lightweightdata-interchangeformat• Object,Array,Value

4

{"name":"JavaOne","edition":2017,"locations":[{"venue":"MosconeWest","city":"SanFrancisco"},{"venue":"Mariott","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONSupportinJavaEE8•  JSONProcessingAPI– StandardAPItoparse,generate,transform,queryJSON– ObjectModelandStreamingAPI•  similartoDOMandStAX

– JSON-P1.1–JSR374•  JSONBindingAPI– BindingJSONdocumentstoJavaobjects•  similartoJAXB

– JSON-B1.0–JSR367

5

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONProcessing

6

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-P•  StreamingAPI– JsonParser– JsonGenerator

• ObjectmodelAPI– JsonReader– JsonWriter– JsonPointer– JsonPatch– JsonMergePatch

7

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JsonParser•  JsonParser– ParsesJSONinastreamingwayfrominputsources– SimilartoStAX’sXMLStreamReader,apullparser

• Createdusing:•  Json.createParser(...),Json.createParserFactory().createParser(...)

• OpOonally,configuredwithfeatures• Parserstateevents:– START_ARRAY,START_OBJECT,KEY_NAME,VALUE_STRING,VALUE_NUMBER,VALUE_TRUE,VALUE_FALSE,VALUE_NULL,END_OBJECT,END_ARRAY

8

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 9

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 10

JsonParser{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECT

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 11

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAME

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 12

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRING

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 13

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAME

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 14

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBER

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 15

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAME

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 16

JsonParser{"name":

"JavaOne","edition":

2017,"location":[

{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAY

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 17

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAYSTART_OBJECT

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 18

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAYSTART_OBJECTKEY_NAME,VALUE_STRING

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 19

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAYSTART_OBJECTKEY_NAME,VALUE_STRINGKEY_NAME,VALUE_STRING

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 20

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAYSTART_OBJECTKEY_NAME,VALUE_STRINGKEY_NAME,VALUE_STRINGEND_OBJECT

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 21

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAYSTART_OBJECTKEY_NAME,VALUE_STRINGKEY_NAME,VALUE_STRINGEND_OBJECTEND_ARRAY

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 22

JsonParser{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

START_OBJECTKEY_NAMEVALUE_STRINGKEY_NAMEVALUE_NUMBERKEY_NAMESTART_ARRAYSTART_OBJECTKEY_NAME,VALUE_STRINGKEY_NAME,VALUE_STRINGEND_OBJECTEND_ARRAYEND_OBJECT

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 23

JsonParserJsonParserparser=Json.createParser(…);

{"name":

"JavaOne","edition":

2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 24

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECT

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 25

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAME

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 26

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //name

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 27

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //nameparser.next(); //VALUE_STRING

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 28

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //nameparser.next(); //VALUE_STRINGparser.getString(); //JavaOne

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 29

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //nameparser.next(); //VALUE_STRINGparser.getString(); //JavaOneparser.next(); //KEY_NAME

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 30

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //nameparser.next(); //VALUE_STRINGparser.getString(); //JavaOneparser.next(); //KEY_NAMEparser.getString(); //edition

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 31

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //nameparser.next(); //VALUE_STRINGparser.getString(); //JavaOneparser.next(); //KEY_NAMEparser.getString(); //editionparser.next(); //VALUE_NUMBER

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 32

JsonParserJsonParserparser=Json.createParser(…);Evente=parser.next();//START_OBJECTparser.next(); //KEY_NAMEparser.getString(); //nameparser.next(); //VALUE_STRINGparser.getString(); //JavaOneparser.next(); //KEY_NAMEparser.getString(); //editionparser.next(); //VALUE_NUMBERparser.getInt(); //2017...

{

"name":"JavaOne",

"edition":2017,

"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JsonGenerator• GeneratesJSONinastreamingwaytooutputsources– SimilartoStAX’sXMLStreamWriter

• Createdusing:– Json.createGenerator(…)– Json.createGeneratorFactory().createGenerator(…)

• OpOonally,configuredwithfeatures– e.g.prejyprinOng

• Allowsmethodschaining

33

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 34

JsonGeneratorJsonGeneratorgen=Json.createGenerator(out);gen.writeStartObject().write("name","JavaOne").write("edition",2017).writeStartArray("location").writeStartObject().write("venue","Moscone").write("city","SanFrancisco").writeEnd().writeEnd().writeEnd().close();

{"name":"JavaOne","edition":2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ObjectModelAPI• BuildertobuildJsonObjectandJsonArrayfromscratch• CanalsouseexisOngJsonObjectandJsonArrayinabuilder•  Type-safe– cannotmixarrayandobjectbuildingmethods

• Allowsmethodschaining

35

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 36

ObjectModelAPIJsonArraylocation=Json.createArrayBuilder().add(Json.createObjectBuilder().add("venue","Moscone").add("city","SanFrancisco")).build();JsonObjectevent=Json.createObjectBuilder().add("name","JavaOne").add("edition",2017).add("location",location).build();

{"name":"JavaOne","edition":2017,"location":[{"venue":"Moscone","city":"SanFrancisco"}]}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-P1.1• UpdateJSON-Pspectostaycurrentwithemergingstandards(RFC7159)•  SupportforIETFstandardson– JSONPointer(RFC6901)– JSONPatch(RFC6902)– JSONMergePatch(RFC7396)

• AddediOng/transformaOonoperaOonstoJSONobjectsandarrays•  SupportforastreamingAPI,togetherwithCollectors•  SupportforprocessingbigJSON,e.g.addfilterstoJSONparsing

37

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONPointer•  IETFRFC6901•  StringsyntaxforidenOfyingaspecificvalue– Token(s)separatedby"/"•  specifykeyinobject•  orindexintoarray

– Ex."/event/locaOon","/conferences/0"

•  Specialcases– Escape"/"with"~1"and"~"with"~0"– "/"pointstothe""keyintheroot– "-"referstotheendofanarray

38

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONPointerJsonStructurejsonEvents=…

JsonPointerpt=Json.createPointer("/1/venue");

JsonValuepreEvt=pt.getValue(jsonEvents);//"Hilton"

JsonStructurenewEvt=pt.replace(jsonEvents,Json.createValue("MosconeWest"));//getValue//replace//add//remove//containsValue

39

[{"event":"OpenWorld","venue":"MosconeNorth"},{"event":"JavaOne","venue":"Hilton"}][{"event":"OpenWorld","venue":"MosconeNorth"},{"event":"JavaOne","venue":"MosconeWest"}]

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONPatch•  IETFRFC6902• ModifyPartsofJSONdocument• PatchisaJSONdocumentitself• OperaOons– Add,replace,remove,move,copy&test

• HTTPPATCHmethod(applicaOon/json-patch+json)

40

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 41

JSONPatch[{"op":"replace","path":"/0/venue","value":"MosconeWest"},{"op":"add","path":"/0/previousVenue","value":"Hilton"}]

[{"event":"JavaOne","venue":"Hilton"}]

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 42

JSONPatch[{"op":"replace","path":"/0/venue","value":"MosconeWest"},{"op":"add","path":"/0/previousVenue","value":"Hilton"}]

[{"event":"JavaOne","venue":"MosconeWest"}]

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 43

JSONPatch[{"op":"replace","path":"/0/venue","value":"MosconeWest"},{"op":"add","path":"/0/previousVenue","value":"Hilton"}]

[{"event":"JavaOne","venue":"MosconeWest","previousVenue":"Hilton"}]

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONPatch

44

JsonArraypreviousJ1=…JsonArraypatch=…

JsonPatchjpVenue=Json.createPatch(patch);

JsonArraycurrentJ1=jpVenue.apply(previousJ1);

JsonPatchpatch2018=Json.createPatchBuilder().copy("/0/previousVenue","/0/venue").replace("/0/venue","MosconeNorth&South").add("/0/days",6).build();

JsonArraynextJ1=patch2018.apply(previousJ1);

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONMergePatch•  IETFRFC7386• DescribeasetofmodificaOonstoatarget• PrimarilyintendedforusewiththeHTTPPATCH

45

JsonValuecontacts=...;//ThetargettobepatchedJsonValuepatch=...;//JSONMergePatchJsonMergePatchmergePatch=Json.createMergePatch(patch);JsonValueresult=mergePatch.apply(contacts);

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONMergePatch

46

{"event":"JavaOne","edition":2016,"venue":"Hilton","dukeCafe":"MasonSt"}

{"edition":2017,"dukeCafe":null,"venue":"MosconeWest","DeveloperKeynote":"Tuesday"}

{"event":"JavaOne","edition":2017,"venue":"MosconeWest","DeveloperKeynote":"Tuesday"}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Diff

47

JsonValuesource=...;JsonValuetarget=...;JsonPatchjsonPatch=json.createDiff(source,target);JsonMergePatchmergePatch=Json.createMergeDiff(source,target);

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-P1.0

48

JsonArraycars=...;JsonArrayaudis=cars.getValuesAs(JsonObject.class).stream().filter(x->"Audi".equals(x.getString("brand"))).map(x->(x.getString("serial"))).collect(Collector.of(()->Json.createArrayBuilder(),(builder,value)->builder.add(value),(builder1,builder2)->builder1.add(builder2),builder->builder.build()));

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-P1.1

49

JsonArraycars=...;JsonArrayaudis=cars.getValuesAs(JsonObject.class).stream().filter(x->"Audi".equals(x.getString("brand"))).map(x->(x.getString("serial")).collect(JsonCollectors.toJsonArray());

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-P1.1–Misc.•  SupportforprocessingbigJSON,e.g.addfilterstoJSONparsing– skipArray()– skipObject()

•  JavadocsisthespecificaCon!

50

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-PResources• hjps://jcp.org/en/jsr/detail?id=374• hjps://json-processing-spec.java.net• hjps://jsonp.java.net• hjps://github.com/json-p

51

<dependency><groupId>org.glassfish</groupId><artifactId>javax.json</artifactId><version>1.1</version></dependency>

<dependency><groupId>javax.json</groupId><artifactId>javax.json-api</artifactId><version>1.1</version></dependency>

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONBinding

52

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONBinding• APItoserialize/deserializeJavaobjectsto/fromJSONdocuments– SimilartoJAX-B– StandardAPIforexisOngframework(ex.Genson,Gson)

• DefaultmappingbetweenclassesandJSON• CustomizaOonAPIs– AnnotaOons(@JsonbProperty,@JsonbNillable)– RunOmeconfiguraOonbuilder

• NaturalfollowontoJSON-P– ClosestheJSONsupportgap– Allowstochangeproviders

53

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

• NoconfiguraOon,noannotaOons•  Scope– BasicTypes– SpecificJDKTypes– Dates– Classes– CollecOons/Arrays– EnumeraOons– JSON-P

54

DefaultMappingimportjavax.json.bind.Jsonb;importjavax.json.bind.JsonbBuilder;//UsedefaultconfigJsonbjsonb=JsonbBuilder.create();...jsonb.close();

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 55

JSON-BInterfacepublicinterfacejavax.json.bind.JsonbextendsAutoCloseable{<T>TfromJson(Stringstr,Class<T>type);<T>TfromJson(Stringstr,TyperuntimeType);<T>TfromJson(Readerreader,Class<T>type);<T>TfromJson(Readerreader,TyperuntimeType);<T>TfromJson(InputStreamstream,Class<T>type);<T>TfromJson(InputStreamstream,TyperuntimeType);StringtoJson(Objectobject);StringtoJson(Objectobject,TyperuntimeType);voidtoJson(Objectobject,Writerwriter);voidtoJson(Objectobject,TyperuntimeType,Writerwriter);voidtoJson(Objectobject,OutputStreamstream);voidtoJson(Objectobject,TyperuntimeType,OutputStreamstream);}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-B

56

//publicEvent(Stringname,intedition,Stringvenue)

List<Event>events=newArrayList<>();h2.add(newEvent("JavaOne",2017,"SFO"));h2.add(newEvent("OpenWorld",2017,"SFO"));h2.add(newEvent("Devoxx",2017,"Antwerp"));Jsonbjsonb=JsonbBuilder.create();StringnextUp=jsonb.toJson(events);

[{"edition":2017,"name":"JavaOne","venue":"SFO"},{"edition":2017,"name":"OpenWorld","venue":"SFO"},{"edition":2017,"name":"Devoxx","venue":"Antwerp"}]

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-B

57

Stringq1Confs="…";

Jsonbjsonb=JsonbBuilder.create();

Eventevent=newEvent();

event=jsonb.fromJson(q1Confs,Event.class);

{"edition":2018,"name":"OracleCode","venue":"Global","cost":0}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BasicTypes– java.lang.String– java.lang.Character– java.lang.Byte(byte)– java.lang.Short(short)– java.lang.Integer(int)– java.lang.Long(long)– java.lang.Float(float)– java.lang.Double(double)– java.lang.Boolean(boolean)

SpecificTypes– java.math.BigInteger– java.math.BigDecimal– java.net.URL– java.net.URI– java.uOl.OpOonal– java.uOl.OpOonalInt– java.uOl.OpOonalLong– java.uOl.OpOonalDouble

58

Types

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Date/Time

59

java.util.Date ISO_DATE_TIME

java.util.Calendar,java.util.GregorianCalendar ISO_DATEiftotimeinformationpresent,otherwiseISO_DATE_TIME

Java.util.TimeZone,java.util.SimpleTimeZone NormalizedCustomId(seeTimeZonejavadoc)

java.time.Instant ISO_INSTANT

java.time.LocalDate ISO_LOCAL_DATE

java.time.LocalTime ISO_LOCAL_TIME

java.time.LocalDateTime ISO_LOCAL_DATE_TIME

java.time.ZonedDateTime ISO_ZONED_DATE_TIME

java.time.OffsetDateTime ISO_OFFSET_DATE_TIME

java.time.OffsetTime ISO_OFFSET_TIME

java.time.ZoneId NormalizedZoneIdasspecifiedinZoneIdjavadoc

java.time.ZoneOffset NormalizedZoneIdasspecifiedinZoneOffsetjavadoc

java.time.Duration ISO8601secondsbasedrepresentation

java.time.Period ISO8601periodrepresentation

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Date/TimeSamples

60

// java.util.Date!SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");!Date parsedDate = sdf.parse("15.11.2016"); !jsonb.toJson(parsedDate)); // ”2016-11-15T00:00:00" !!// java.util.Calendar!Calendar dateCalendar = Calendar.getInstance(); !dateCalendar.clear(); !dateCalendar.set(2016, 11, 15); !jsonb.toJson(dateCalendar); // ”2016-11-15” !!// java.time.Instant!jsonb.toJson(Instant.parse("2016-11-15T23:00:00Z")); // ”2016-11-15T23:00:00Z” !!// java.time.Duration!jsonb.toJson(Duration.ofHours(5).plusMinutes(4)); // “PT5H4M" !!// java.time.Period!jsonb.toJson(Period.between( !

LocalDate.of(1960, Month.JANUARY, 1), !LocalDate.of(1970, Month.JANUARY, 1))); // "P10Y"!

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Arrays/CollecOons• CollecOon• Map•  Set• HashSet• NavigableSet•  SortedSet•  TreeSet•  LinkedHashSet

•  TreeHashSet• HashMap• NavigableMap•  SortedMap•  TreeMap•  LinkedHashMap•  TreeHashMap•  List

• ArrayList•  LinkedList• Deque• ArrayDeque• Queue• PriorityQueue•  EnumSet•  EnumMap

61

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-PTypes

62

JsonObjectj1=Json.createObjectBuilder().add("name","JavaOne").add("venue","MosconeWest").add("edition",2017).build();Jsonbjsonb=JsonbBuilder.create();StringCurrentConf=jsonb.toJson(j1);

•  javax.json.JsonArray•  javax.json.JsonStructure•  javax.json.JsonValue•  javax.json.JsonPointer•  javax.json.JsonString•  javax.json.JsonNumber•  javax.json.JsonObject

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Classes• PublicandprotectednestedandstaCcnestedclasses• Anonymousclasses(serializaOononly)•  Inheritanceissupported• Defaultno-argumentconstructorisrequiredfordeserializaOon

63

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Fields•  Finalfieldsareserialized•  StaCcfieldsareskipped•  Transientfieldsareskipped• Nullfieldsareskipped•  Fieldsorder– Lexicographicalorder– Parentclassfieldsareserializedbeforechildclassfields

64

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

publicclassParent{publicintparentB;publicintparentA;}

publicclassChildextendsParent{publicintchildB;publicintchildA;}

{"parentA":1,"parentB":2}{"parentA":1,"parentB":2,

"ChildA":3,"ChildB":4,}

65

FieldsOrder

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-BEngineConfiguraOon• AnnotaOons• RunOmeconfiguraOon– JsonbConfig– JsonbBuilder

68

JsonbConfigconfig=newJsonbConfig().withFormatting(…).withNullValues(…).withEncoding(…).withStrictIJSON(…).withPropertyNamingStrategy(…).withPropertyOrderStrategy(…).withPropertyVisibilityStrategy(…).withAdapters(…).withBinaryDataStrategy(…);Jsonbjsonb=JsonbBuilder.newBuilder().withConfig(…) .withProvider(…).build();

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 69

CustomizaOons• Propertynames• Propertyorder•  IgnoringproperOes• Nullhandling• CustominstanOaOon

•  Fieldsvisibility• Date/NumberFormats• BinaryEncoding• Adapters•  Serializers/Deserializers

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

• AnnotaOon– @JsonbProperty

•  Scope– Field– Gejer/Sejer– Parameter

70

PropertyNamespublicclassEvent{privateintedition;@JsonbProperty("conference")privateStringeventName;}publicclassCustomer{publicintedition;publicStringvenue;@JsonbProperty("conference")

publicStringgetEventName(){returneventName;}}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

PropertyNamingStrategy•  Supportednamingstrategies– IDENTITY(myMixedCaseProperty)– LOWER_CASE_WITH_DASHES(my-mixed-case-property)– LOWER_CASE_WITH_UNDERSCORES(my_mixed_case_property)– UPPER_CAMEL_CASE(MyMixedCaseProperty)– UPPER_CAMEL_CASE_WITH_SPACES(MyMixedCaseProperty)– CASE_INSENSITIVE(mYmIxEdCaSePrOpErTy)– OracustomimplementaOon

•  JsonbConfig– withPropertyNamingStrategy(…):

71

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

•  Strategies– LEXICOGRAPHICAL(A-Z)– ANY– REVERSE(Z-A)

• AnnotaOon– @JsonbPropertyOrderonclass

•  JsonbConfig– withPropertyOrderStrategy(…)

72

PropertyOrderStrategy@JsonbPropertyOrder(ANY)

publicclassFoo{publicintbar2;publicintbar1;}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

• AnnotaOon– @JsonbTransient

73

TransientPropertypublicclassEvent{publicStringname;publicStringvenue;

@JsonbTransient

publicintfoodRating;}

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

• Nullfieldsareskippedbydefault• AnnotaOon– @JsonbNillable

•  JsonbConfig– withNullValues(true)

•  java.lang.OpOonal

74

NullhandlingpublicclassEvent{publicStringname;publicintedition;@JsonbNillabepublicStringvenue;

}[{"edition":2017,"name":"JavaOne","venue":null}]

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Adapters&Serializer/Deserializer•  ForJavatypesthatdonotmapnaturallytoaJSONrepresentaOon• Adapter–  javax.json.bind.adapter.JsonbAdapterimplementaOon– Convert“unmappable”type(Original)intoanotheronethatJSONBcanhandle(Adapted)

•  Serializer/Deserializer–  javax.json.bind.serializers.JsonbSerializerimplementaOon– LowlevelaccesstoJSONPparser/generator

• CustominstanOaOon– Overcometheno-argconstructorrequirement

75

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Andmore…• Date&Numberformat– @JsonbDateFormat,@JsonbNumberFormat&JsonbConfig

• PropertyVisibility– @JsonbVisibility&JsonbConfig

• BinaryEncoding– BYTE(default),BASE_64,BASE_64_URL,viaJsonbConfig

•  I-JSON– WithafewexcepOons

76

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JavaEE8–ModernizaOon&SimplificaOon

77

CDI2.0

JSON-B1.0(*)

Security1.0(*)

BeanValidaCon2.0

JSF2.3

Servlet4.0

JSON-P1.1

JAX-RS2.1 ReacOveClientAPI,Server-SentEvents,…

HTTP/2,ServerPush,…

Java<->JSONbinding

UpdatestoJSONstandards,JSONCollectors,…

AsyncEvent,Observersordering,SEsupport,…

EmbraceJavaSE8,newconstraints,…

ImprovedCDI,WebSocket,SE8integraOon,…

PortableIdenOtyStore,AuthenOcaOon&SecurityContext

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

EclipseEnterpriseforJava-EE4JMovingJavaEEtoEclipseFoundaCon

78

Technology

Communityand

VendorsSponsorship

[email protected]

ü Nimbleü Flexibleü Openü CompaOble

EnterpriseforJava

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Resources•  SpecificaOon– hjps://www.jcp.org/en/jsr/detail?id=367– hjp://json-b.net– hjps://github.com/json-b– hjps://java.net/projects/jsonb-spec

• ReferenceImplementaOon– hjps://github.com/eclipse/yasson– hjps://projects.eclipse.org/projects/rt.yasson

79