Date post: | 08-Jan-2017 |
Category: |
Software |
Upload: | lukas-jungmann |
View: | 1,618 times |
Download: | 0 times |
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JSONSupportinJavaEE8LukasJungmannJSON-PEGMemberlukas.jungmann@oracle.com@jlukasNovember16,2016
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
SafeHarborStatementThefollowingisintendedtooutlineourgeneralproductdirecSon.ItisintendedforinformaSonpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfuncSonality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andSmingofanyfeaturesorfuncSonalitydescribedforOracle’sproductsremainsatthesolediscreSonofOracle.
2
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
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgenda
IntroducSon
JSONProcessing
JSONBinding
Q&A
1
2
3
4
4
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntroducSon
5
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JSONSupportinJavaEE8• JSONProcessingAPI– StandardAPItoparse,generate,transform,queryJSON– ObjectModelandStreamingAPI• similartoDOMandStAX
• JSONBindingAPI– BindingJSONdocumentstoJavaobjects• similartoJAXB
6
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JSONProcessing
7
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
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 9
JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 10
JsonParserSTART_OBJECT !{ !
"name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 11
JsonParserSTART_OBJECT!KEY_NAME !
{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 12
JsonParserSTART_OBJECT!KEY_NAME !VALUE_STRING !
{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
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" ! } ! ] !} !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 23
JsonParser{ ! "name": ! "John Doe", ! "age": ! 35, ! "phoneNumbers": ! [ ! { ! "type": "home", ! "number": "123-456-789" ! } ! ] !} !
JsonParser p = Json.createParser(...); !!
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 !!
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!!
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!!
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!!
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!!
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!!
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!!
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!!
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 !!!
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JsonGenerator• GeneratesJSONinastreamingwaytooutputsources– SimilartoStAX’sXMLStreamWriter
• Createdusing:– Json.createGenerator(…)– Json.createGeneratorFactory().createGenerator(…)
• OpSonally,configuredwithfeatures– e.g.prenyprinSng
• Allowsmethodchaining
33
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" ! } !] !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ObjectModelAPI• BuildertobuildJsonObjectandJsonArrayfromscratch• Allowsmethodchaining• Type-safe(cannotmixarrayandobjectbuildingmethods)• CanalsouseexisSngJsonObjectandJsonArrayinabuilder
35
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" ! } !] !
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
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JsonPointer• IETFRFC6901• StringsyntaxforidenSfyingaspecificvalue– /phone/mobile– /parents/0
• Specialcharacters– "/"—>"~1"– "~"—>"~0"
• Absolute
38
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 ! }!] !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JsonPatch• IETFRFC6902• ModifyPartsofJSONdocument• PatchisaJSONdocumentitself• OperaSons:– Add,replace,remove,move,copy,test
• HTTPPATCHmethod(applicaSon/json-patch+json)
40
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 ! }!] !
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 ! }!] !
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 ! } !] !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JSONBinding
44
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
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(); !
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); !} !
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 ! } !] !
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
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
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"!
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
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); !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Classes• PublicandprotectednestedandstaMcnestedclasses• Anonymousclasses(serializaSononly)• Inheritanceissupported• Defaultno-argumentconstructorisrequiredfordeserializaSon
54
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Fields• Finalfieldsareserialized• StaMcfieldsareskipped• Transientfieldsareskipped• Nullfieldsareskipped• Fieldsorder– Lexicographicalorder– Parentclassfieldsareserializedbeforechildclassfields
55
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
public class Parent { ! public int parentB; ! public int parentA; !} !
{ ! "parentA": 1, ! "parentB": 2 !} !
56
FieldsOrderSample
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
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
SerializaMon• ExisSngfieldswithpublicgeners• Publicfieldswithnogeners• Publicgener/senerpairwithoutacorrespondingfield
• DeserializaMon• ExisSngfieldswithpublicseners• Publicfieldswithnoseners• Publicgener/senerpairwithoutacorrespondingfield
58
ScopeandFieldAccessStrategy
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
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(); !!
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 61
CustomizaSons• Propertynames• Propertyorder• IgnoringproperSes• Nullhandling• CustominstanSaSon
• Fieldsvisibility• Adapters• Date/NumberFormats• BinaryEncoding
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; ! } !} !!
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
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; !} !
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
• AnnotaSon– @JsonbTransient
65
IgnoringProperSespublic class Customer { ! public int id; !
public String name; !!
@JsonbTransient! public BigDecimal salary; !} !
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; !} !!!
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; !} !
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
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; !} !
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); !!!
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
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()); !!!
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()); !! !
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
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Q&A
75
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Thankyou!
76