1+ package org .openapitools .jackson .nullable ;
2+
3+
4+ import tools .jackson .core .JacksonException ;
5+ import tools .jackson .core .JsonParser ;
6+ import tools .jackson .core .JsonToken ;
7+ import tools .jackson .databind .DeserializationConfig ;
8+ import tools .jackson .databind .DeserializationContext ;
9+ import tools .jackson .databind .JavaType ;
10+ import tools .jackson .databind .ValueDeserializer ;
11+ import tools .jackson .databind .deser .ValueInstantiator ;
12+ import tools .jackson .databind .deser .std .ReferenceTypeDeserializer ;
13+ import tools .jackson .databind .jsontype .TypeDeserializer ;
14+ import tools .jackson .databind .type .ReferenceType ;
15+
16+ public class JsonNullableJackson3Deserializer extends ReferenceTypeDeserializer <JsonNullable <Object >> {
17+
18+
19+ private boolean isStringDeserializer = false ;
20+
21+ /*
22+ /**********************************************************
23+ /* Life-cycle
24+ /**********************************************************
25+ */
26+ public JsonNullableJackson3Deserializer (JavaType fullType , ValueInstantiator inst ,
27+ TypeDeserializer typeDeser , ValueDeserializer <?> deser ) {
28+ super (fullType , inst , typeDeser , deser );
29+ if (fullType instanceof ReferenceType && ((ReferenceType ) fullType ).getReferencedType () != null ) {
30+ this .isStringDeserializer = ((ReferenceType ) fullType ).getReferencedType ().isTypeOrSubTypeOf (String .class );
31+ }
32+ }
33+
34+ /*
35+ /**********************************************************
36+ /* Abstract method implementations
37+ /**********************************************************
38+ */
39+
40+ @ Override
41+ public JsonNullable <Object > deserialize (JsonParser p , DeserializationContext ctxt ) throws JacksonException {
42+ JsonToken t = p .currentToken ();
43+ if (t == JsonToken .VALUE_STRING && !isStringDeserializer ) {
44+ String str = p .getString ().trim ();
45+ if (str .isEmpty ()) {
46+ return JsonNullable .undefined ();
47+ }
48+ }
49+ return super .deserialize (p , ctxt );
50+ }
51+
52+ @ Override
53+ protected ReferenceTypeDeserializer <JsonNullable <Object >> withResolved (TypeDeserializer typeDeser , ValueDeserializer <?> valueDeser ) {
54+ return new JsonNullableJackson3Deserializer (_fullType , _valueInstantiator ,
55+ typeDeser , valueDeser );
56+ }
57+
58+ @ Override
59+ public Object getAbsentValue (DeserializationContext ctxt ) {
60+ return JsonNullable .undefined ();
61+ }
62+
63+ @ Override
64+ public JsonNullable <Object > getNullValue (DeserializationContext ctxt ) {
65+ return JsonNullable .of (null );
66+ }
67+
68+ @ Override
69+ public Object getEmptyValue (DeserializationContext ctxt ) {
70+ return JsonNullable .undefined ();
71+ }
72+
73+ @ Override
74+ public JsonNullable <Object > referenceValue (Object contents ) {
75+ return JsonNullable .of (contents );
76+ }
77+
78+ @ Override
79+ public Object getReferenced (JsonNullable <Object > reference ) {
80+ return reference .get ();
81+ }
82+
83+ @ Override
84+ public JsonNullable <Object > updateReference (JsonNullable <Object > reference , Object contents ) {
85+ return JsonNullable .of (contents );
86+ }
87+
88+ @ Override
89+ public Boolean supportsUpdate (DeserializationConfig config ) {
90+ // yes; regardless of value deserializer reference itself may be updated
91+ return Boolean .TRUE ;
92+ }
93+ }
0 commit comments