Skip to content

Commit 0b05963

Browse files
committed
support json schema generation for @JsonUnwrapped (#271)
1 parent a69bd56 commit 0b05963

File tree

2 files changed

+109
-14
lines changed

2 files changed

+109
-14
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.fasterxml.jackson.databind.ser.impl;
2+
3+
import com.fasterxml.jackson.databind.JavaType;
4+
import com.fasterxml.jackson.databind.JsonMappingException;
5+
import com.fasterxml.jackson.databind.SerializerProvider;
6+
import com.fasterxml.jackson.databind.jsonFormatVisitors.*;
7+
8+
/**
9+
* Default "empty" implementation, useful as the base to start on; especially as
10+
* it is guaranteed to implement all the method of the interface, even if new
11+
* methods are getting added.
12+
*/
13+
class JsonFormatVisitorNullWrapper implements JsonFormatVisitorWrapper {
14+
protected SerializerProvider _provider;
15+
16+
public JsonFormatVisitorNullWrapper() {
17+
}
18+
19+
public JsonFormatVisitorNullWrapper(SerializerProvider p) {
20+
_provider = p;
21+
}
22+
23+
@Override
24+
public SerializerProvider getProvider() {
25+
return _provider;
26+
}
27+
28+
@Override
29+
public void setProvider(SerializerProvider p) {
30+
_provider = p;
31+
}
32+
33+
@Override
34+
public JsonObjectFormatVisitor expectObjectFormat(JavaType type)
35+
throws JsonMappingException {
36+
return null;
37+
}
38+
39+
@Override
40+
public JsonArrayFormatVisitor expectArrayFormat(JavaType type)
41+
throws JsonMappingException {
42+
return null;
43+
}
44+
45+
@Override
46+
public JsonStringFormatVisitor expectStringFormat(JavaType type)
47+
throws JsonMappingException {
48+
return null;
49+
}
50+
51+
@Override
52+
public JsonNumberFormatVisitor expectNumberFormat(JavaType type)
53+
throws JsonMappingException {
54+
return null;
55+
}
56+
57+
@Override
58+
public JsonIntegerFormatVisitor expectIntegerFormat(JavaType type)
59+
throws JsonMappingException {
60+
return null;
61+
}
62+
63+
@Override
64+
public JsonBooleanFormatVisitor expectBooleanFormat(JavaType type)
65+
throws JsonMappingException {
66+
return null;
67+
}
68+
69+
@Override
70+
public JsonNullFormatVisitor expectNullFormat(JavaType type)
71+
throws JsonMappingException {
72+
return null;
73+
}
74+
75+
@Override
76+
public JsonAnyFormatVisitor expectAnyFormat(JavaType type)
77+
throws JsonMappingException {
78+
return null;
79+
}
80+
81+
@Override
82+
public JsonMapFormatVisitor expectMapFormat(JavaType type)
83+
throws JsonMappingException {
84+
return null;
85+
}
86+
87+
};

src/main/java/com/fasterxml/jackson/databind/ser/impl/UnwrappingBeanPropertyWriter.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
import java.util.Iterator;
44
import java.util.Map.Entry;
55

6-
import com.fasterxml.jackson.core.*;
6+
import com.fasterxml.jackson.core.JsonGenerator;
77
import com.fasterxml.jackson.core.io.SerializedString;
88
import com.fasterxml.jackson.databind.JavaType;
99
import com.fasterxml.jackson.databind.JsonMappingException;
1010
import com.fasterxml.jackson.databind.JsonNode;
1111
import com.fasterxml.jackson.databind.JsonSerializer;
1212
import com.fasterxml.jackson.databind.SerializerProvider;
13+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
1314
import com.fasterxml.jackson.databind.node.ObjectNode;
14-
import com.fasterxml.jackson.databind.ser.*;
15+
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
1516
import com.fasterxml.jackson.databind.util.NameTransformer;
1617

1718
/**
@@ -135,21 +136,28 @@ public void assignSerializer(JsonSerializer<Object> ser)
135136
/**********************************************************
136137
*/
137138

138-
// TODO: if/how to change this? Base class has this
139-
/*
140139
@Override
141-
public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor)
142-
throws JsonMappingException
143-
{
144-
if (objectVisitor != null) {
145-
if (isRequired()) {
146-
objectVisitor.property(this);
147-
} else {
148-
objectVisitor.optionalProperty(this);
149-
}
140+
public void depositSchemaProperty(final JsonObjectFormatVisitor visitor)
141+
throws JsonMappingException {
142+
SerializerProvider provider = visitor.getProvider();
143+
JsonSerializer<Object> ser = provider
144+
.findValueSerializer(this.getType(), this)
145+
.unwrappingSerializer(_nameTransformer);
146+
147+
if (ser.isUnwrappingSerializer()) {
148+
ser.acceptJsonFormatVisitor(new JsonFormatVisitorNullWrapper(provider) {
149+
// an unwrapping serializer will always expect ObjectFormat,
150+
// hence, the other cases do not have to be implemented
151+
@Override
152+
public JsonObjectFormatVisitor expectObjectFormat(JavaType type)
153+
throws JsonMappingException {
154+
return visitor;
155+
}
156+
}, this.getType());
157+
} else {
158+
super.depositSchemaProperty(visitor);
150159
}
151160
}
152-
*/
153161

154162
// Override needed to support legacy JSON Schema generator
155163
@Override

0 commit comments

Comments
 (0)