Katharsis JSON-API Documentation Documentation Release 3.0.0 ...
Java EE 8 What’s New on the JSON Front - RainFocus · JSON Support in Java EE 8 • JSON...
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.|
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.|
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• 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
ü 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