Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
JSONB introduction and comparison with other frameworks
Report
Dmitry Kornilov
Follow
Senior Software Development Manager at Oracle
Mar. 8, 2016
•
0 likes
9 likes
×
Be the first to like this
Show More
•
7,355 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Check these out next
Helidon 概要
オラクルエンジニア通信
Oracle Database Vaultのご紹介
オラクルエンジニア通信
Cassandra Performance and Scalability on AWS
Adrian Cockcroft
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
オラクルエンジニア通信
Oracle Database Performance Tuning Concept
Chien Chung Shen
Oracle Data Integrator R12.2.1.1 Agentセットアップガイド
オラクルエンジニア通信
Dkos(mesos기반의 container orchestration)
Won-Chon Jung
Docker Container Security
Suraj Khetani
1
of
68
Top clipped slide
JSONB introduction and comparison with other frameworks
Mar. 8, 2016
•
0 likes
9 likes
×
Be the first to like this
Show More
•
7,355 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Technology
Slides from my presentation on EclipseCon 2016.
Dmitry Kornilov
Follow
Senior Software Development Manager at Oracle
Advertisement
Advertisement
Advertisement
Recommended
K8s beginner 2_advanced_ep02_201904221130_post
Inho Kang
990 views
•
97 slides
Kubernetes Networking
Giragadurai Vallirajan
1.6K views
•
31 slides
4. 대용량 아키텍쳐 설계 패턴
Terry Cho
17.1K views
•
70 slides
Oracle Data Integrator R12.2.1.1 Studio及びRepositoryセットアップガイド
オラクルエンジニア通信
1.2K views
•
40 slides
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
SeungYong Oh
17.3K views
•
59 slides
Driving Digital Transformation With Containers And Kubernetes Complete Deck
SlideTeam
104 views
•
49 slides
More Related Content
Slideshows for you
(20)
Helidon 概要
オラクルエンジニア通信
•
1.1K views
Oracle Database Vaultのご紹介
オラクルエンジニア通信
•
4.1K views
Cassandra Performance and Scalability on AWS
Adrian Cockcroft
•
41.8K views
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
オラクルエンジニア通信
•
2K views
Oracle Database Performance Tuning Concept
Chien Chung Shen
•
2.1K views
Oracle Data Integrator R12.2.1.1 Agentセットアップガイド
オラクルエンジニア通信
•
1.4K views
Dkos(mesos기반의 container orchestration)
Won-Chon Jung
•
3.4K views
Docker Container Security
Suraj Khetani
•
959 views
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
OpenStack Korea Community
•
44.6K views
オラクルの運用管理ソリューションご紹介(2021/02 版)
オラクルエンジニア通信
•
570 views
第18回しゃちほこオラクル俱楽部
オラクルエンジニア通信
•
617 views
Qlik AutoMLによる機械学習モデル生成の自動化
QlikPresalesJapan
•
425 views
Metal³ – Metal Kubed, Bare Metal Provisioning for Kubernetes | Kim Bảo Long
Vietnam Open Infrastructure User Group
•
241 views
C22 Oracle Database を監視しようぜ! by 山下正/内山義夫
Insight Technology, Inc.
•
4.8K views
Kubernetes Networking
CJ Cullen
•
26.2K views
Introduction To Containers - Builders Day Israel
Amazon Web Services
•
1.4K views
Oracle Database統合のベスト・プラクティス
オラクルエンジニア通信
•
175 views
Always on in sql server 2017
Gianluca Hotz
•
1.2K views
デモとディスカッションで体験するOracle DBトラブル対応
歩 柴田
•
4.2K views
Oracle Database 12c : Multitenant
Digicomp Academy Suisse Romande SA
•
4.2K views
Viewers also liked
(14)
JSON Support in Java EE 8
Dmitry Kornilov
•
32.9K views
Java EE 8 - February 2017 update
David Delabassee
•
6K views
What is tackled in the Java EE Security API (Java EE 8)
Rudy De Busscher
•
18.8K views
Json Processing API (JSR 353) review
Martin Skurla
•
1.5K views
What’s new in JSR 367 Java API for JSON Binding
Dmitry Kornilov
•
1.5K views
JSON-B for CZJUG
Dmitry Kornilov
•
1.3K views
Java EE 8 - An instant snapshot
David Delabassee
•
10.7K views
Java on Azure
Philly JUG
•
2.1K views
Java EE Next
David Delabassee
•
2.2K views
Adopt-a-JSR session (JSON-B/P)
Dmitry Kornilov
•
723 views
Testing Java EE Applications Using Arquillian
Reza Rahman
•
25.7K views
JavaOne 2011: Migrating Spring Applications to Java EE 6
Bert Ertman
•
119.7K views
Memory Management: What You Need to Know When Moving to Java 8
AppDynamics
•
34.6K views
Down-to-Earth Microservices with Java EE
Reza Rahman
•
103.6K views
Advertisement
Similar to JSONB introduction and comparison with other frameworks
(20)
Java API for JSON Binding - Introduction and update
Martin Grebac
•
3.1K views
What's new in the Java API for JSON Binding
Dmitry Kornilov
•
1.1K views
Burns jsf-confess-2015
Edward Burns
•
2.3K views
Oracle database 12c_and_DevOps
Maria Colgan
•
9.2K views
Module 1: JavaScript Basics
Daniel McGhan
•
1.2K views
Interactive Java Support to your tool -- The JShell API and Architecture
JavaDayUA
•
1.1K views
Nonblocking Database Access in Helidon SE
Dmitry Kornilov
•
831 views
20160123 java one2015_feedback @ Osaka
Takashi Ito
•
465 views
JavaOne2015報告会 in Okinawa
Takashi Ito
•
745 views
Configuration for Java EE and the Cloud
Dmitry Kornilov
•
655 views
Oracle NoSQL
Oracle Korea
•
185 views
Configuration for Java EE: Config JSR and Tamaya
Dmitry Kornilov
•
3.9K views
Java basics at dallas technologies
dallastechnologiesinbtm
•
149 views
2008_478_Lyons_ppt.ppt
Chadharris42
•
4 views
Intro to JavaScript for APEX Developers
Daniel McGhan
•
642 views
JavaOne 2014 BOF4241 What's Next for JSF?
Edward Burns
•
29.7K views
40020
tutorialsruby
•
1.6K views
40020
tutorialsruby
•
502 views
JavaOne2015フィードバック @ 富山合同勉強会
Takashi Ito
•
759 views
Java EE 6 Live Hacking - Java Developer Day 2012
Martin Fousek
•
534 views
More from Dmitry Kornilov
(10)
Jakarta EE: Today and Tomorrow
Dmitry Kornilov
•
2.7K views
Building Cloud-Native Applications with Helidon
Dmitry Kornilov
•
938 views
JSON Support in Jakarta EE: Present and Future
Dmitry Kornilov
•
416 views
Building cloud native microservices with project Helidon
Dmitry Kornilov
•
586 views
Developing cloud-native microservices using project Helidon
Dmitry Kornilov
•
582 views
From Java EE to Jakarta EE
Dmitry Kornilov
•
743 views
Helidon: Java Libraries for Writing Microservices
Dmitry Kornilov
•
904 views
Introduction to Yasson
Dmitry Kornilov
•
1.4K views
JSON Support in Java EE 8
Dmitry Kornilov
•
1.6K views
Java EE for the Cloud
Dmitry Kornilov
•
2K views
Advertisement
Recently uploaded
(20)
LeedsSharp May 2023 - Azure Integration Services
Michael Stephenson
•
11 views
Chapter 3 - ET.pdf
Habtamu Yetwale
•
3 views
INT 1010 03.pdf
Luis R Castellanos
•
4 views
SpinoS Corporate Presentation.pptx
Vaishak26
•
0 views
ppt 2.pptx
ishaanshehrawat
•
0 views
INT 1010 09-2.pdf
Luis R Castellanos
•
4 views
Test Presentation.pptx
Abiral Neupane
•
7 views
INT 1010 10-3.pdf
Luis R Castellanos
•
0 views
Exploring the Power of EXO Drones.pdf
uszizz. com
•
0 views
k8s_dev.pdf
Christoph Zimmermann
•
10 views
Intro_Net_91407.ppt
SuhailParakkal5
•
0 views
DEADLOCK_.pptx
MahnoorGhega1
•
0 views
different topics blogging articles.
AishaSajidAishaSajid
•
0 views
INT 1010 01.pdf
Luis R Castellanos
•
6 views
AusCERT 2023 - Non-linear, decentralised and multi-stakeholder incident respo...
Pukhraj Singh
•
0 views
LISA EVO-X Pitch Deck
LEX101Labs
•
0 views
AI.pptx
GursheenKaurChawla
•
0 views
Week1Lec03-Dimensional Analysis.pptx.pdf
AlakhKumar6
•
4 views
INT 1010 02.pdf
Luis R Castellanos
•
4 views
DLL_MAPEH 6_Q1_W1.docx
JovhelTibay
•
0 views
JSONB introduction and comparison with other frameworks
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. JSONB introduction and comparison with other frameworks Dmitry Kornilov JSONB spec lead dmitry.kornilov@oracle.com
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3 Program Agenda 1. What is JSON-B 2.
What is in the spec 3. Default mapping 4. Customized mapping 5. Q&A
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4 • JSON Binding is a standard •
It’s about converting Java objects to and from JSON documents • JSON Binding = JSON-B = JSONB = JSR 367 What is JSON Binding? 4
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 5 What is JSON Binding? 5 public class Customer { public int id; public String firstName; public String lastName; …. } Customer e = new Customer(); e.id = 1; e.firstName = “John”; e.lastName = “Doe”; { "id": 1, "firstName" : "John", "lastName" : "Doe", } Java JSON
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 6 What is JSON Binding? 6 public class Customer { public int id; public String firstName; public String lastName; …. } Customer e = new Customer(); e.id = 1; e.firstName = “John”; e.lastName = “Doe”; { "id": 1, "firstName" : "John", "lastName" : "Doe", } Java JSON JSON-B
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 7 • Genson •
Gson • Jackson • … Alternatives 7
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | JSON-B Specification 8
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 99 Java Community Process • JSR-367 •
JSR status and updates • Expert group
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1010 Specification and API Project • Hosted on java.net •
Spec in pdf format • Git repository • Wiki • Bug tracker • Mailing lists
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1111 Participate! users@jsonb-spec.java.net
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1212 Reference Implementation • eclipselink.org/jsonb •
Mirror on GitHub
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1313 Summary • JCP Page https://www.jcp.org/en/jsr/detail?id=367 •
Specification Project Home: https://java.net/projects/jsonb-spec • API sources & samples: https://java.net/projects/jsonb-spec/sources/git/show/api • Specification in pdf: https://java.net/projects/jsonb-spec/sources/git/content/spec/spec.pdf • Reference implementation: http://eclipselink.org/jsonb
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | JSON-B Default Mapping 14
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1515 Default Mapping • No configuration, no annotations •
The scope: – Basic Types – Specific JDK Types – Dates – Classes – Collections/Arrays – Enumerations – JSON-P import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; // Create with default config Jsonb jsonb = JsonbBuilder.create();
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • toJson(…) • fromJson(…) 1616 JSON-B Engine String
toJson(Object object); String toJson(Object object, Type runtimeType); void toJson(Object object, Writer writer); void toJson(Object object, Type runtimeType, Writer appendable); void toJson(Object object, OutputStream stream); void toJson(Object object, Type runtimeType, OutputStream stream); <T> T fromJson(String str, Class<T> type); <T> T fromJson(String str, Type runtimeType); <T> T fromJson(Reader readable, Class<T> type); <T> T fromJson(Reader readable, Type runtimeType); <T> T fromJson(InputStream stream, Class<T> type); <T> T fromJson(InputStream stream, Type runtimeType);
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1717 Default Mapping – Basic Types •
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)
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1818 Default Mapping – Basic Types •
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) Serialization: toString() Deserialization: parseXXX()
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 1919 • 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) Default Mapping – Basic Types “string” ’u0041’ (byte) 1 (short) 1 (int) 1 1L 1.2f 1.2 true “string” “A” 1 1 1 1 1.2 1.2 true
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2020 Default Mapping – Specific Types •
java.math.BigInteger • java.math.BigDecimal • java.net.URL • java.net.URI • java.util.Optional • java.util.OptionalInt • java.util.OptionalLong • java.util.OptionalDouble
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • java.math.BigInteger • java.math.BigDecimal •
java.net.URL • java.net.URI • java.util.Optional • java.util.OptionalInt • java.util.OptionalLong • java.util.OptionalDouble 2121 Default Mapping – Specific Types Serialization: toString() Deserialization: Single argument constructor
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2222 Default Mapping – Specific Types •
java.math.BigInteger • java.math.BigDecimal • java.net.URL • java.net.URI • java.util.Optional • java.util.OptionalInt • java.util.OptionalLong • java.util.OptionalDouble Serialization: toString() Deserialization: Single argument constructor • Represented by its value if not empty • Considered null if empty
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2323 Optional Types OptionalInt.of(1) OptionalInt.empty() JSON-B 1 Genson
{"asInt": 1, "present": true} Gson {”value": 1, "present": true} Jackson 1 JSON-B null Genson - Gson {”value": 0, "present": false} Jackson null
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2424 Default Mapping – Dates java.util.Date
ISO_DATE_TIME java.util.Calendar, java.util.GregorianCalendar ISO_DATE if to time information present,otherwise ISO_DATE_TIME Java.util.TimeZone, java.util.SimpleTimeZone NormalizedCustomId (see TimeZone javadoc) 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 NormalizedZoneId as specified in ZoneId javadoc java.time.ZoneOffset NormalizedZoneId as specified in ZoneOffset javadoc java.time.Duration ISO 8601 seconds based representation java.time.Period ISO 8601 period representation
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2525 SimpleDateFormat sdf
= new SimpleDateFormat("dd.MM.yyyy"); Date date = sdf.parse("08.03.2016"); Default Mapping – Date Sample JSON-B “2016-03-08T00:00:00” Genson 1457391600000 Gson "Mar 8, 2016 12:00:00 AM” Jackson 1457391600000
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2626 Default Mapping – Calendar
Sample Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(2016, 3, 8); JSON-B “2016-03-08” Genson 1457391600000 Gson {"year":2016, "month":3, "dayOfMonth":8, "hourOfDay":0, "minute":0, "second": 0} Jackson 1457391600000
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2727 Default Mapping – Classes •
Public and protected nested and static nested classes • Anonymous classes (serialization only) • Inheritance is supported • Default no-argument constructor is required for deserialization
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2828 Default Mapping – Fields •
Final fields are serialized • Static fields are skipped • Transient fields are skipped • Null fields are skipped • Lexicographical order • Parent class fields are serialized before child class fields
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 2929 Fields Order Comparison class Parent
{ public int parentB = 2; public int parentA = 1; } class Child extends Parent { public int childB = 4; public int childA = 3; } JSON-B {"parentA":1,"parentB":2, "childA":3, "childB":4} Genson {"childA":3, "childB":4, "parentA":1,"parentB":2} Gson {"childB":4, "childA":3, "parentB":2,"parentA":1} Jackson {"parentB":2,"parentA":1, "childB":4, "childA":3}
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3030 Default Mapping – Scope and Field Access Strategy Serialization •
Existing fields with public getters • Public fields with no getters • Public getter/setter pair without a corresponding field Deserialization • Existing fields with public setters • Public fields with no setters • Public getter/setter pair without a corresponding field
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3131 Scope and Field Access Strategy – JSON-B 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 }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3232 Scope and Field Access Strategy – Genson 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, "publicWithPrivateGetter": 1, "publicNullField": null, "privateWithPublicGetter": 1, "noField": 1 }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3333 Scope and Field Access Strategy – Gson 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, "privateFinalField": 1, "publicWithNoGetter": 1, "publicWithPrivateGetter": 1, "privateWithNoGetter": 1, "privateWithPublicGetter": 1, }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3434 Scope and Field Access Strategy – Jackson 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, "publicWithPrivateGetter": 1, "publicNullField": null, "privateWithPublicGetter": 1, "noField": 1 }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3535 Scope and Field Access Strategy – Summary Framework Respects getters/setters Strict getter/setter Private fields
Virtual fields JSON-B Yes Yes No Yes Genson Yes No No Yes Gson No No Yes No Jackson Yes No No Yes
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3636 // Array int[]
intArray = {1, 2, 3}; jsonb.toJson(intArray); // [1,2,3] // Collection Collection<Object> list = new ArrayList<>(); list.add(1); list.add(2); list.add(null); jsonb.toJson(list); // [1,2,null] // Map Map<String, Object> map = new LinkedHashMap<>(); map.put("first", 1); map.put("second", 2); jsonb.toJson(map); // {"first":1,"second":2} Arrays/Collections • Collection • Map • Set • HashSet • NavigableSet • SortedSet • TreeSet • LinkedHashSet • TreeHashSet • HashMap • NavigableMap • SortedMap • TreeMap • LinkedHashMap • TreeHashMap • List • ArrayList • LinkedList • Deque • ArrayDeque • Queue • PriorityQueue • EnumSet • EnumMap
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3737 JSON-P Types •
javax.json.JsonArray • javax.json.JsonStructure • javax.json.JsonValue • javax.json.JsonPointer • javax.json.JsonString • javax.json.JsonNumber
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3838 JSON-P Types •
javax.json.JsonArray • javax.json.JsonStructure • javax.json.JsonValue • javax.json.JsonPointer • javax.json.JsonString • javax.json.JsonNumber Serialization: javax.json.JsonWriter Deserialization: javax.json.JsonReader
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 3939 JsonBuilderFactory f
= Json.createBuilderFactory(null); JsonObject jsonObject = f.createObjectBuilder() .add(“name", "Jason") .add(“city", "Prague") .build(); JSON-P Sample { "name": "Jason", ”city": ”Prague" }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4040 JSON-P Types Support in Other Frameworks •
Genson: – Support added in JSR353Bundle • Gson – No JSON-P support • Jackson – Support added in JSR353Module
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | Customized Mapping 41
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4242 JSON-B Engine Configuration JsonbConfig config
= new JsonbConfig() .withFormatting(…) .withNullValues(…) .withEncoding(…) .withStrictIJSON(…) .withPropertyNamingStrategy(…) .withPropertyOrderStrategy(…) .withPropertyVisibilityStrategy(…) .withAdapters(…) .withBinaryDataStrategy(…); Jsonb jsonb = JsonbBuilder.newBuilder() .withConfig(…) .withProvider(…) .build(); • Annotations • Runtime configuration – JsonbConfig – JsonbBuilder
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4343 Customizations • Property names •
Property order • Ignoring properties • Null handling • Custom instantiation • Fields visibility • Adapters • Date/Number Formats • Binary Encoding
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4444 Property Name Customization • JSON-B: –
@JsonbProperty (Field, Method) • Genson: – @JsonProperty (Field, Method) – Use GensonBuilder().rename() method • Gson: – @SerializedName (Field) • Jackson: – @JsonProperty (Field, Method)
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4545 Custom Mapping - Property Names public
class Customer { public int id; public String firstName; } { "id": 1, "firstName": "Jason" }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4646 Custom Mapping - Property Names public
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; } } { "id": 1, "name": "Jason" }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4747 Custom Mapping - Property Names public
class Customer { public int id; public String firstName; @JsonbProperty(“getter-name") String getFirstName() { return firstName; } @JsonbProperty(“setter-name") void setFirstName(String str) { this.firstName = str; } } Serialization: { "id": 1, “getter-name": "Jason" } Deserialization: { "id": 1, “setter-name": "Jason" }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 4848 Property Naming Strategy • Supported naming strategies –
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 (My Mixed Case Property) – CASE_INSENSITIVE (mYmIxEdCaSePrOpErTy) – Or a custom implementation • JsonbConfig().withPropertyNamingStrategy(…):
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • Genson – GensonBuilder.with(PropertyNameResolver…
resolvers) • Gson: – GsonBuilder.setFieldNamingPolicy(FieldNamingPolicy policy) • Jackson – ObjectMapper.setPropertyNamingStrategy(PropertyNamingStrategy pns) 4949 Property Naming Strategy
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 5050 Property Order Strategy • Strategies: –
LEXICOGRAPHICAL (A-Z) – ANY – REVERSE (Z-A) • Compile Time: – @JsonbPropertyOrder on class • Runtime: – withPropertyOrderStrategy(…) @JsonbPropertyOrder(ANY) public class Foo { public int bar2; public int bar1; }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • Compile Time: – Transient modifier –
@JsonbTransient annotation – PropertyVisibilityStrategy interface – @JsonbVisibility annotation • Runtime: – withPropertyVisibilityStrategy(…) 5151 Ignoring Properties and Visibility Customization public class Foo { public transient int skipped; @JsonbTransient public int alsoSkipped; } @JsonbVisibility(MyStrategy.class) public class Bar { private int field1; private int field2; }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • Genson – @JsonIgnore
annotation – Include(…) and exclude(…) methods in GensonBuilderclass • Gson: – @Exposed annotation – ExclusionStrategy interface • Jackson – @JsonIgnore annotation on field – @JsonIgnoreProperties annotation on class – Filters and mix-ins 5252 Ignoring Properties in Other Frameworks
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • Null fields are skipped by default • Compile Time: –
@JsonbNillableannotation • Runtime: – JsonbConfig().withNullValues(true) 5353 Null Handling public class Customer { public int id = 1; @JsonbNillable public String name = null; }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 5454 Null Handling in Other Frameworks Framework Serializes nulls by default Null Handling JSON-B No
@JsonbNillable Genson Yes GensonBuilder.setSkipNull(true) Gson No GsonBuilder.serializeNulls() Jackson Yes @JsonInclude(JsonInclude.Include.NON_NULL) ObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 5555 Custom Instantiation 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": 1, "customer": { "id": 2 } }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • JAXB inspired JsonbAdapter interface •
@JsonbTypeAdapter annotation • JsonbConfig().withAdapters(JsonbAdapter… adapters); 5656 Adapters
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. public class Car
{ public Integer distance; // In Miles } 5757 Adapters Sample
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. public class Car
{ public Integer distance; // In Miles } public class AdaptedCar { public Integer distance; // In Kilometers } 5858 Adapters Sample
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. public class Car
{ public Integer distance; // In Miles } public class AdaptedCar { public Integer distance; // In Kilometers } public class CarAdapter implements JsonbAdapter<Car, AdaptedCar> { public AdaptedCar toJson(Car car) { AdaptedCar adaptedCar = new AdaptedCar(); adaptedCar.distance = car.distance * 1,60934; return adaptedCar; } public Car fromJson(AdaptedCar adaptedCar) { Car car = new Car(); car.distance = adaptedCar.distance / 1,60934; return car; } } 5959 Adapters Sample
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. JsonbConfig config =
new JsonbConfig() .withAdapters(new CarAdapter()); Jsonb jsonb = JsonbBuilder.create(config); Car car = new Car(); car.distance = 100; // miles String json = jsonb.toJson(car); 6060 Adapters Sample { "distance": 160 }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. • Genson – Converter interface –
JAXB adapters support with JAXBBundle • Gson: – TypeAdapter interface • Jackson – External serializers – Mix-In annotations 6161 Adapters in Other Frameworks
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 6262 Date/Number Format public class
FormatTest { public Date defaultDate; @JsonbDateFormat("dd.MM.yyyy") public Date formattedDate; public BigDecimal defaultNumber; @JsonbNumberFormat(“#0.00") public BigDecimal formattedNumber; } { “defaultDate”: “2015-07-26T23:00:00", “formattedDate”: ”26.07.2015", “defaultNumber": 1.2, “formattedNumber": 1.20 }
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | Date/Number Formats in other Frameworks • Genson – @JsonDateFormat
annotation – GensonBuilder.setDateFormat(dateFormat) • Gson: – GsonBuilder.setDateFormat • Jackson – @JsonFormat annotation – objectMapper.setDateFormat(myDateFormat);
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 6464 Binary Data Encoding • BYTE (default) •
BASE_64 • BASE_64_URL JsonbConfig config = new JsonbConfig() .withBinaryDataStrategy(BinaryDataStrategy.BASE_64); Jsonb jsonb = JsonbBuilder.create(config); String json = jsonb.toJson(obj);
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 6565 I-JSON • I-JSON (”Internet JSON”) is a restricted profile of JSON –
https://tools.ietf.org/html/draft-ietf-json-i-json-06 • JSON-B fully supports I-JSON by default with three exceptions: – JSON Binding does not restrict the serialization of top-level JSON texts that are neither objects nor arrays. The restriction should happen at application level. – JSON Binding does not serialize binary data with base64url encoding. – JSON Binding does not enforce additional restrictions on dates/times/duration. • Configuration: withStrictIJSONSerializationCompliance
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 6666 Special Thanks • Roman Grigoriadi
and David Kral from JSON-B team • All members of JSON-B experts group • others on users@jsonb-spec.java.net
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | Q&A 67
Advertisement