+ All Categories
Home > Software > JSON support in Java EE 8

JSON support in Java EE 8

Date post: 08-Jan-2017
Category:
Upload: lukas-jungmann
View: 1,618 times
Download: 0 times
Share this document with a friend
77
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JSON Support in Java EE 8 Lukas Jungmann JSON-P EG Member [email protected] @jlukas November 16, 2016
Transcript
Page 1: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONSupportinJavaEE8LukasJungmannJSON-PEGMemberlukas.jungmann@oracle.com@jlukasNovember16,2016

Page 2: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

SafeHarborStatementThefollowingisintendedtooutlineourgeneralproductdirecSon.ItisintendedforinformaSonpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfuncSonality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andSmingofanyfeaturesorfuncSonalitydescribedforOracle’sproductsremainsatthesolediscreSonofOracle.

2

Page 3: JSON support in Java EE 8

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

LukasJungmann

•  So#wareDeveloper@Oracle•  JSON-B(JSR-367)EGmember•  JSON-P(JSR-374)EGmember•  JPA(JSR-338)Speclead•  EclipseLinkprojectcommiJer

Page 4: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

ProgramAgenda

IntroducSon

JSONProcessing

JSONBinding

Q&A

1

2

3

4

4

Page 5: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

IntroducSon

5

Page 6: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

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

•  JSONBindingAPI– BindingJSONdocumentstoJavaobjects•  similartoJAXB

6

Page 7: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONProcessing

7

Page 8: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JsonParser•  JsonParser– ParsesJSONinastreamingwayfrominputsources– SimilartoStAX’sXMLStreamReader,apullparser

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

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

8

Page 9: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 10: JSON support in Java EE 8

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

JsonParserSTART_OBJECT !{ !

"name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 11: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 12: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 13: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 14: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 15: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 16: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 17: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !START_OBJECT !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 18: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !START_OBJECT !KEY_NAME, KEY_STRING !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 19: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !START_OBJECT !KEY_NAME, KEY_STRING !KEY_NAME, KEY_STRING !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 20: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !START_OBJECT !KEY_NAME, KEY_STRING !KEY_NAME, KEY_STRING !END_OBJECT !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 21: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !START_OBJECT !KEY_NAME, KEY_STRING !KEY_NAME, KEY_STRING !END_OBJECT !END_ARRAY !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 22: JSON support in Java EE 8

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

JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !KEY_NAME !VALUE_NUMBER !KEY_NAME !START_ARRAY !START_OBJECT !KEY_NAME, KEY_STRING !KEY_NAME, KEY_STRING !END_OBJECT !END_ARRAY !END_OBJECT !

{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

Page 23: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !!

Page 24: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !!

Page 25: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!!

Page 26: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name!!

Page 27: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name !parser.next(); // VALUE_STRING!!

Page 28: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name !parser.next(); // VALUE_STRING !parser.getString(); // John Doe!!

Page 29: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name !parser.next(); // VALUE_STRING !parser.getString(); // John Doe !parser.next(); // KEY_NAME!!

Page 30: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name !parser.next(); // VALUE_STRING !parser.getString(); // John Doe !parser.next(); // KEY_NAME!parser.getString(); // age!!

Page 31: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name !parser.next(); // VALUE_STRING !parser.getString(); // John Doe !parser.next(); // KEY_NAME!parser.getString(); // age!parser.next(); // VALUE_NUMBER!!

Page 32: JSON support in Java EE 8

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

JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !

JsonParser p = Json.createParser(...); !Event e = p.next(); // START_OBJECT !parser.next(); // KEY_NAME!parser.getString(); // name !parser.next(); // VALUE_STRING !parser.getString(); // John Doe !parser.next(); // KEY_NAME!parser.getString(); // age!parser.next(); // VALUE_NUMBER !parser.getInt (); // 35 !!!

Page 33: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JsonGenerator• GeneratesJSONinastreamingwaytooutputsources– SimilartoStAX’sXMLStreamWriter

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

• OpSonally,configuredwithfeatures– e.g.prenyprinSng

• Allowsmethodchaining

33

Page 34: JSON support in Java EE 8

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

JsonGeneratorJsonGenerator ge=Json.createGenerator(…); !ge.writeStartArray() ! .writeStartObject() ! .write("type", "home”) ! .write("number", "123-456-789") ! .writeEnd() ! .writeStartObject() ! .write("type", "fax”) ! .write("number", "123-456-790") ! .writeEnd() ! .writeEnd() !.close(); !

[ ! { ! "type": "home”, ! "number": "123-456-789" ! }, ! { ! "type": "fax”, ! "number": "123-456-790" ! } !] !

Page 35: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

ObjectModelAPI• BuildertobuildJsonObjectandJsonArrayfromscratch• Allowsmethodchaining•  Type-safe(cannotmixarrayandobjectbuildingmethods)• CanalsouseexisSngJsonObjectandJsonArrayinabuilder

35

Page 36: JSON support in Java EE 8

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

ObjectModelAPIJsonArray value = Json.createArrayBuilder() ! .add(Json.createObjectBuilder() ! .add("type", "home") ! .add("number", "123-456-789") ! ) ! .add(Json.createObjectBuilder() ! .add("type", "fax") ! .add("number", "123-456-790") ! ) ! .build(); !

[ ! { ! "type": "home”, ! "number": "123-456-789" ! }, ! { ! "type": "fax”, ! "number": "123-456-790" ! } !] !

Page 37: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

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

• AddediSng/transformaSonoperaSonstoJSONobjectsandarrays•  SupportforastreamingAPI,togetherwithCollectors•  SupportforprocessingbigJSON,e.g.addfilterstoJSONparsing.

37

Page 38: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JsonPointer•  IETFRFC6901•  StringsyntaxforidenSfyingaspecificvalue– /phone/mobile– /parents/0

•  Specialcharacters– "/"—>"~1"– "~"—>"~0"

• Absolute

38

Page 39: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONPointerSampleJsonArray dogs = . . .; !

JsonPointer pointer = ! Json.createPointer("/1/breed"); !

JsonValue breed = ! pointer.getValue(dogs); !

p.replace(dogs, ! Json.createValue("English Bulldog")); !

39

[ ! { ! "name": "Cassidy", ! "breed": "English Bulldog", ! "age": 6 ! }, ! { ! "name": "Falco", ! "breed": "Pug", ! "age": 4 ! }!] !

Page 40: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JsonPatch•  IETFRFC6902• ModifyPartsofJSONdocument• PatchisaJSONdocumentitself• OperaSons:– Add,replace,remove,move,copy,test

• HTTPPATCHmethod(applicaSon/json-patch+json)

40

Page 41: JSON support in Java EE 8

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

JSONPatchSample[ ! { "op": "replace", ! "path": "/1/breed", ! "value": "English Bulldog" }, ! { "op": "remove", ! "path": "/2" } !] !

[ ! { ! "name": "Cassidy", ! "breed": "English Bulldog", ! "age": 6 ! }, ! { ! "name": "Falco", ! "breed": "Pug", ! "age": 4 ! }, ! { ! "name": "Funes", ! "breed": "Frenchie", ! "age": 2 ! }!] !

Page 42: JSON support in Java EE 8

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

JSONPatchSample[ ! { "op": "replace", ! "path": "/1/breed", ! "value": "English Bulldog" }, ! { "op": "remove", ! "path": "/2" } !] !

[ ! { ! "name": "Cassidy", ! "breed": "English Bulldog", ! "age": 6 ! }, ! { ! "name": "Falco", ! "breed": "English Bulldog", ! "age": 4 ! }, ! { ! "name": "Funes", ! "breed": "Frenchie", ! "age": 2 ! }!] !

Page 43: JSON support in Java EE 8

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

JSONPatchSample[ ! { "op": "replace", ! "path": "/1/breed", ! "value": "English Bulldog" }, ! { "op": "remove", ! "path": "/2" } !] !

[ ! { ! "name": "Cassidy", ! "breed": "English Bulldog", ! "age": 6 ! }, ! { ! "name": "Falco", ! "breed": "English Bulldog", ! "age": 4 ! } !] !

Page 44: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONBinding

44

Page 45: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JSONBinding• APItoserialize/deserializeJavaobjectsto/fromJSONdocuments– SimilartoJAX-B– Standardizesthecurrenttechnologies(Jackson,Genson,Gson)

• DefaultmappingbetweenclassesandJSON• CustomizaSonAPIs– AnnotaSons(@JsonbProperty,@JsonbNillable)– RunSmeconfiguraSonbuilder

• NaturalfollowontoJSON-P– ClosestheJSONsupportgap– Allowstochangeproviders

45

Page 46: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• NoconfiguraSon,noannotaSons•  Thescope:– BasicTypes– SpecificJDKTypes– Dates– Classes– CollecSons/Arrays– EnumeraSons– JSON-P

46

DefaultMappingimport javax.json.bind.Jsonb; !import javax.json.bind.JsonbBuilder; !!// Create with default config !Jsonb jsonb = JsonbBuilder.create(); !

Page 47: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 47

JSON-BEnginepublic interface Jsonb extends AutoCloseable { ! <T> T fromJson(String str, Class<T> type); ! <T> T fromJson(String str, Type runtimeType); ! <T> T fromJson(Reader reader, Class<T> type); ! <T> T fromJson(Reader reader, Type runtimeType); ! <T> T fromJson(InputStream stream, Class<T> type); ! <T> T fromJson(InputStream stream, Type runtimeType); !! String toJson(Object object); ! String toJson(Object object, Type runtimeType); ! void toJson(Object object, Writer writer); ! void toJson(Object object, Type runtimeType, Writer writer); ! void toJson(Object object, OutputStream stream); ! void toJson(Object object, Type runtimeType, OutputStream stream); !} !

Page 48: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

JSON-BSample

48

Dog dog1 = new Dog(); !dog1.setName("Cassidy"); !dog1.setBreed("English Bulldog"); !dog1.setAge(6); !!Dog dog2 = new Dog(); !dog2.setName("Falco"); !dog2.setBreed("English Bulldog"); !dog2.setAge(4); !!List<Dog> dogs = new ArrayList<>(); !dogs.add(dog1); !dogs.add(dog2); !!Jsonb jsonb = JsonbBuilder.create(); !jsonb.toJson(dogs); !

[ ! { ! "name": "Cassidy", ! "breed": "English Bulldog", ! "age": 6 ! }, ! { ! "name": "Falco", ! "breed": "English Bulldog", ! "age": 4 ! } !] !

Page 49: JSON support in Java EE 8

Copyright©2016,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.uSl.OpSonal– java.uSl.OpSonalInt– java.uSl.OpSonalLong– java.uSl.OpSonalDouble

49

BasicandSpecificTypes

Page 50: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

Date/Time

50

java.uSl.Date ISO_DATE_TIME

java.uSl.Calendar,java.uSl.GregorianCalendar ISO_DATEiftoSmeinformaSonpresent,otherwiseISO_DATE_TIME

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

java.Sme.Instant ISO_INSTANT

java.Sme.LocalDate ISO_LOCAL_DATE

java.Sme.LocalTime ISO_LOCAL_TIME

java.Sme.LocalDateTime ISO_LOCAL_DATE_TIME

java.Sme.ZonedDateTime ISO_ZONED_DATE_TIME

java.Sme.OffsetDateTime ISO_OFFSET_DATE_TIME

java.Sme.OffsetTime ISO_OFFSET_TIME

java.Sme.ZoneId NormalizedZoneIdasspecifiedinZoneIdjavadoc

java.Sme.ZoneOffset NormalizedZoneIdasspecifiedinZoneOffsetjavadoc

java.Sme.DuraSon ISO8601secondsbasedrepresentaSon

java.Sme.Period ISO8601periodrepresentaSon

Page 51: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

Date/TimeSamples

51

// java.util.Date!SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");!Date parsedDate = sdf.parse("25.10.2015"); !jsonb.toJson(parsedDate); // ”2015-10-25T00:00:00" !!// java.util.Calendar!Calendar dateCalendar = Calendar.getInstance(); !dateCalendar.clear(); !dateCalendar.set(2015, 10, 25); !jsonb.toJson(dateCalendar); // ”2015-10-25” !!// java.time.Instant!jsonb.toJson(Instant.parse("2015-10-25T23:00:00Z")); // ”2015-10-25T23: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"!

Page 52: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

Arrays/CollecSons• CollecSon• Map•  Set• HashSet• NavigableSet•  SortedSet•  TreeSet•  LinkedHashSet•  TreeHashSet• HashMap

• NavigableMap•  SortedMap•  TreeMap•  LinkedHashMap•  TreeHashMap•  List• ArrayList•  LinkedList• Deque• ArrayDeque

• Queue• PriorityQueue•  EnumSet•  EnumMap

52

Page 53: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

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

53

JSON-PTypes// JsonObject !JsonBuilderFactory f = !

Json.createBuilderFactory(null); !!JsonObject jsonObject = !

f.createObjectBuilder() ! .add(“name", "Jason") ! .add(“city", "Prague") ! .build(); !!jsonb.toJson(jsonObject); !

Page 54: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

Classes• PublicandprotectednestedandstaMcnestedclasses• Anonymousclasses(serializaSononly)•  Inheritanceissupported• Defaultno-argumentconstructorisrequiredfordeserializaSon

54

Page 55: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

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

55

Page 56: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

public class Parent { ! public int parentB; ! public int parentA; !} !

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

56

FieldsOrderSample

Page 57: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

public class Parent { ! public int parentB; ! public int parentA; !} !!public class Child extends Parent { ! public int childB; ! public int childA; !} !

{ ! "parentA": 1, ! "parentB": 2 !} !!{ ! "parentA": 1, ! "parentB": 2, !! "childA": 3, ! "childB": 4 !} !

57

FieldsOrderSample

Page 58: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

SerializaMon•  ExisSngfieldswithpublicgeners• Publicfieldswithnogeners• Publicgener/senerpairwithoutacorrespondingfield

• DeserializaMon•  ExisSngfieldswithpublicseners• Publicfieldswithnoseners• Publicgener/senerpairwithoutacorrespondingfield

58

ScopeandFieldAccessStrategy

Page 59: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

public class Foo { ! public final int publicFinalField; ! private final int privateFinalField; !! public static int publicStaticField; !! public int publicWithNoGetter; ! public int publicWithPrivateGetter; ! public Integer publicNullField = null; !! private int privateWithNoGetter; ! private int privateWithPublicGetter; !! public int getNoField() {}; ! public void setNoField(int value) {}; !} !

{ ! "publicFinalField": 1, ! !!!! "publicWithNoGetter": 1, ! !! !! "privateWithPublicGetter": 1, ! ! "noField": 1 !} !

59

ScopeandFieldAccessStrategy

Page 60: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• AnnotaSons• RunSmeconfiguraSon– JsonbConfig– JsonbBuilder

60

JSON-BEngineConfiguraSonJsonbConfig config = new JsonbConfig() ! .withFormatting(…) ! .withNullValues(…) ! .withEncoding(…) ! .withStrictIJSON(…) ! .withPropertyNamingStrategy(…) ! .withPropertyOrderStrategy(…) ! .withPropertyVisibilityStrategy(…) ! .withAdapters(…) ! .withBinaryDataStrategy(…); !!Jsonb jsonb = JsonbBuilder.newBuilder() ! .withConfig(…) ! .withProvider(…) ! .build(); !!

Page 61: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 61

CustomizaSons• Propertynames• Propertyorder•  IgnoringproperSes• Nullhandling• CustominstanSaSon

•  Fieldsvisibility• Adapters• Date/NumberFormats• BinaryEncoding

Page 62: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• AnnotaSon– @JsonbProperty

•  Scope:– Field– Gener/Sener– Parameter

62

PropertyNamespublic class Customer { ! private int id; !! @JsonbProperty("name") ! private String firstName; !} !!public class Customer { ! public int id; ! public String firstName; !! @JsonbProperty("name") ! public String getFirstName() { ! return firstName; ! } !} !!

Page 63: JSON support in Java EE 8

Copyright©2016,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)– OracustomimplementaSon

•  JsonbConfig– withPropertyNamingStrategy(…):

63

Page 64: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

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

• AnnotaSon– @JsonbPropertyOrderonclass

•  JsonbConfig– withPropertyOrderStrategy(…)

64

PropertyOrderStrategy@JsonbPropertyOrder(ANY)!public class Foo { ! public int bar2; ! public int bar1; !} !

Page 65: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• AnnotaSon– @JsonbTransient

65

IgnoringProperSespublic class Customer { ! public int id; !

public String name; !!

@JsonbTransient! public BigDecimal salary; !} !

Page 66: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• PropertyVisibilityStrategyinterface• AnnotaSon– @JsonbVisibility

•  JsonbConfig– withPropertyVisibilityStrategy(…)

66

PropertyVisibilitypublic interface PropertyVisibilityStrategy { ! boolean isVisible(Field field); ! boolean isVisible(Method method); !} !!public class MuStrategy implements ! PropertyVisibilityStrategy { ! /* ... */!} !!@JsonbVisibility(MyStrategy.class) !public class Bar { ! private int field1; ! private int field2; !} !!!

Page 67: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• Nullfieldsareskippedbydefault• AnnotaSon– @JsonbNillable

•  JsonbConfig– withNullValues(true)

67

NullHandlingpublic class Customer { ! public int id = 1; !! @JsonbNillable! public String name = null; !} !!@JsonbNillable!public class Customer { ! public int id = 1; ! public String name = null; !} !

Page 68: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

public class Customer { ! public int id; ! public String name; !! @JsonbCreator! public static Customer getFromDb(int id) { ! return CustomerDao.getByPrimaryKey(id); ! }!} !!public class Order { ! public int id; ! public Customer customer; !} !

!!!!!!!!!!{ ! "id": 123, ! "customer": { ! "id": 562, ! }!} !!

68

CustomInstanSaSon

Page 69: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

• AnnotaSons– @JsonbDateFormat– @JsonbNumberFormat

•  JsonbConfig– withDateFormat(…)– withLocale(…)

69

Date/NumberFormatpublic class FormatSample { ! public Date defaultDate; !! @JsonbDateFormat("dd.MM.yyyy") ! public Date formattedDate; !! public BigDecimal defaultNumber; !! @JsonbNumberFormat(“#0.00") ! public BigDecimal formattedNumber; !} !

Page 70: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

•  Supportedencodings– BYTE(default)– BASE_64– BASE_64_URL

•  JsonbConfig– withBinaryDataStrategy(…)

70

BinaryDataEncodingJsonbConfig config = new JsonbConfig() ! .withBinaryDataStrategy(! BinaryDataStrategy.BASE_64); !!Jsonb jsonb = JsonbBuilder.create(config); !String json = jsonb.toJson(obj); !!!

Page 71: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

I-JSON•  I-JSON(”InternetJSON”)isarestrictedprofileofJSON– hnps://tools.iez.org/html/dra{-iez-json-i-json-06

•  JSON-BfullysupportsI-JSONbydefaultwiththreeexcepSons:– JSONBindingdoesnotrestricttheserializaSonoftop-levelJSONtextsthatareneitherobjectsnorarrays.TherestricSonshouldhappenatapplicaSonlevel.– JSONBindingdoesnotserializebinarydatawithbase64urlencoding.– JSONBindingdoesnotenforceaddiSonalrestricSonsondates/Smes/duraSon.

•  JsonbConfig– withStrictIJSON(true)

71

Page 72: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

•  InspiredbyJAXB• AnnotaSons– @JsonbTypeAdapterannotaSon

•  JsonbConfig– withAdapters(…)

72

Adapterspublic interface JsonbAdapter<Original, Adapted> {! Adapted adaptToJson(Original obj); ! Original adaptFromJson(Adapted obj); !} !!@JsonbTypeAdapter(AnimalAdapter.class) !public Animal animal; !!JsonbConfig config = new JsonbConfig() ! .withAdapters(new AnimalAdapter()); !!!

Page 73: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

•  LowlevelcontrolonserializaSon/deserializaSon• AnnotaSons– @JsonbTypeSerializer– @JsonbTypeDeserializer

•  JsonbConfig– withSerializers(…)– withDeserializers(…)

73

Serializers/Deserializerspublic interface JsonbSerializer<T> { ! void serialize(T obj, JsonGenerator generator, !

SerializationContext ctx); !!public interface JsonbDeserializer<T> { ! T deserialize(JsonParser parser, !

DeserializationContext ctx, Type rtType); !} !!@JsonbTypeSerializer(AnimalSerializer.class) !@JsonbTypeDeserializer(AnimalDeserializer.class) !public Animal animal; !!JsonbConfig config = new JsonbConfig() ! .withSerializers(new AnimalSerializer()) ! .withDeserializers(new AnimalDeserializer()); !! !

Page 74: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

References•  JSON-PspecificaSon:– hnps://json-processing-spec.java.net/

•  JSON-PreferenceimplementaSon:– hnps://jsonp.java.net/

•  JSON-B:– hnp://json-b.net/

74

Page 75: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

Q&A

75

Page 76: JSON support in Java EE 8

Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|

Thankyou!

76

Page 77: JSON support in Java EE 8

Recommended