Skip to content

Commit aa7aa3a

Browse files
committed
Implement #28 (add serializers for JsonPatch, JsonMergePatch)
1 parent 8fb2081 commit aa7aa3a

File tree

8 files changed

+260
-4
lines changed

8 files changed

+260
-4
lines changed

jakarta-jsonp/src/main/java/com/fasterxml/jackson/datatype/jsonp/JSONPModule.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
77
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
88
import com.fasterxml.jackson.databind.module.SimpleModule;
9+
import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer;
910
import com.fasterxml.jackson.databind.type.CollectionType;
1011
import com.fasterxml.jackson.databind.type.MapType;
12+
import com.fasterxml.jackson.databind.util.Converter;
13+
import com.fasterxml.jackson.databind.util.StdConverter;
1114

1215
import jakarta.json.*;
1316
import jakarta.json.spi.JsonProvider;
@@ -34,6 +37,10 @@ public JSONPModule(JsonProvider jsonProvider) {
3437
final JsonMergePatchDeserializer jsonMergePatchDeser = new JsonMergePatchDeserializer(jsonValueDeser);
3538

3639
addSerializer(JsonValue.class, new JsonValueSerializer());
40+
// Since 2.14.2
41+
addSerializer(JsonPatch.class, new JsonPatchSerializer());
42+
addSerializer(JsonMergePatch.class, new JsonMergePatchSerializer());
43+
3744
setDeserializers(new SimpleDeserializers() {
3845
@Override
3946
public JsonDeserializer<?> findBeanDeserializer(
@@ -93,4 +100,68 @@ public boolean hasDeserializerFor(DeserializationConfig config, Class<?> valueTy
93100
}
94101
});
95102
}
103+
104+
/**
105+
* @since 2.14.2
106+
*/
107+
static class JsonPatchSerializer extends StdDelegatingSerializer
108+
{
109+
private static final long serialVersionUID = 1L;
110+
111+
public JsonPatchSerializer() {
112+
super(new PatchConverter());
113+
}
114+
115+
protected JsonPatchSerializer(Converter<Object,?> converter,
116+
JavaType delegateType, JsonSerializer<?> delegateSerialize) {
117+
super(converter, delegateType, delegateSerialize);
118+
}
119+
120+
@Override
121+
protected StdDelegatingSerializer withDelegate(Converter<Object,?> converter,
122+
JavaType delegateType, JsonSerializer<?> delegateSerializer) {
123+
return new JsonPatchSerializer(converter, delegateType, delegateSerializer);
124+
}
125+
126+
static class PatchConverter
127+
extends StdConverter<JsonPatch,JsonArray>
128+
{
129+
@Override
130+
public JsonArray convert(JsonPatch value) {
131+
return value.toJsonArray();
132+
}
133+
}
134+
}
135+
136+
/**
137+
* @since 2.14.2
138+
*/
139+
static class JsonMergePatchSerializer extends StdDelegatingSerializer
140+
{
141+
private static final long serialVersionUID = 1L;
142+
143+
public JsonMergePatchSerializer() {
144+
super(new PatchConverter());
145+
}
146+
147+
protected JsonMergePatchSerializer(Converter<Object,?> converter,
148+
JavaType delegateType, JsonSerializer<?> delegateSerialize) {
149+
super(converter, delegateType, delegateSerialize);
150+
}
151+
152+
@Override
153+
protected StdDelegatingSerializer withDelegate(Converter<Object,?> converter,
154+
JavaType delegateType, JsonSerializer<?> delegateSerializer) {
155+
return new JsonMergePatchSerializer(converter, delegateType, delegateSerializer);
156+
}
157+
158+
static class PatchConverter
159+
extends StdConverter<JsonMergePatch, JsonValue>
160+
{
161+
@Override
162+
public JsonValue convert(JsonMergePatch value) {
163+
return value.toJsonValue();
164+
}
165+
}
166+
}
96167
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.fasterxml.jackson.datatype.jsonp;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
5+
import jakarta.json.JsonMergePatch;
6+
7+
public class JsonMergePatchSerializationTest extends TestBase
8+
{
9+
private static final ObjectMapper MAPPER = newMapper();
10+
11+
public void testSimpleSerialization() throws Exception
12+
{
13+
// First need a patch so deserialization must work
14+
final String input = "{" +
15+
"\"name\":\"Json\"" +
16+
"}";
17+
final JsonMergePatch patch1 = MAPPER.readValue(input, JsonMergePatch.class);
18+
final String output = MAPPER.writeValueAsString(patch1);
19+
20+
// and read back
21+
final JsonMergePatch patch2 = MAPPER.readValue(output, JsonMergePatch.class);
22+
assertEquals(patch1.toJsonValue(), patch2.toJsonValue());
23+
}
24+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fasterxml.jackson.datatype.jsonp;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
5+
import jakarta.json.JsonPatch;
6+
7+
public class JsonPatchSerializationTest extends TestBase
8+
{
9+
private static final ObjectMapper MAPPER = newMapper();
10+
11+
public void testSimpleSerialization() throws Exception
12+
{
13+
// First need a patch so deserialization must work
14+
final String input = "[" +
15+
"{" +
16+
"\"op\":\"replace\"," +
17+
"\"path\":\"/name\"," +
18+
"\"value\":\"Json\"" +
19+
"}" +
20+
"]";
21+
final JsonPatch jsonPatch = MAPPER.readValue(input, JsonPatch.class);
22+
final String output = MAPPER.writeValueAsString(jsonPatch);
23+
24+
// and read back
25+
final JsonPatch jsonPatch2 = MAPPER.readValue(output, JsonPatch.class);
26+
assertEquals(jsonPatch, jsonPatch2);
27+
}
28+
}

jsr-353/src/main/java/com/fasterxml/jackson/datatype/jsr353/JSR353Module.java

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package com.fasterxml.jackson.datatype.jsr353;
22

3+
import javax.json.*;
4+
import javax.json.spi.JsonProvider;
5+
import java.util.Collections;
6+
37
import com.fasterxml.jackson.databind.*;
48
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
59
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
610
import com.fasterxml.jackson.databind.module.SimpleModule;
11+
import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer;
712
import com.fasterxml.jackson.databind.type.CollectionType;
813
import com.fasterxml.jackson.databind.type.MapType;
9-
10-
import javax.json.*;
11-
import javax.json.spi.JsonProvider;
12-
import java.util.Collections;
14+
import com.fasterxml.jackson.databind.util.Converter;
15+
import com.fasterxml.jackson.databind.util.StdConverter;
1316

1417
public class JSR353Module extends SimpleModule
1518
{
@@ -35,6 +38,10 @@ public JSR353Module(JsonProvider jsonProvider)
3538
final JsonMergePatchDeserializer jsonMergePatchDeser = new JsonMergePatchDeserializer(jsonValueDeser);
3639

3740
addSerializer(JsonValue.class, new JsonValueSerializer());
41+
// Since 2.14.2
42+
addSerializer(JsonPatch.class, new JsonPatchSerializer());
43+
addSerializer(JsonMergePatch.class, new JsonMergePatchSerializer());
44+
3845
setDeserializers(new SimpleDeserializers() {
3946
@Override
4047
public JsonDeserializer<?> findBeanDeserializer(
@@ -94,4 +101,68 @@ public boolean hasDeserializerFor(DeserializationConfig config, Class<?> valueTy
94101
}
95102
});
96103
}
104+
105+
/**
106+
* @since 2.14.2
107+
*/
108+
static class JsonPatchSerializer extends StdDelegatingSerializer
109+
{
110+
private static final long serialVersionUID = 1L;
111+
112+
public JsonPatchSerializer() {
113+
super(new PatchConverter());
114+
}
115+
116+
protected JsonPatchSerializer(Converter<Object,?> converter,
117+
JavaType delegateType, JsonSerializer<?> delegateSerialize) {
118+
super(converter, delegateType, delegateSerialize);
119+
}
120+
121+
@Override
122+
protected StdDelegatingSerializer withDelegate(Converter<Object,?> converter,
123+
JavaType delegateType, JsonSerializer<?> delegateSerializer) {
124+
return new JsonPatchSerializer(converter, delegateType, delegateSerializer);
125+
}
126+
127+
static class PatchConverter
128+
extends StdConverter<JsonPatch,JsonArray>
129+
{
130+
@Override
131+
public JsonArray convert(JsonPatch value) {
132+
return value.toJsonArray();
133+
}
134+
}
135+
}
136+
137+
/**
138+
* @since 2.14.2
139+
*/
140+
static class JsonMergePatchSerializer extends StdDelegatingSerializer
141+
{
142+
private static final long serialVersionUID = 1L;
143+
144+
public JsonMergePatchSerializer() {
145+
super(new PatchConverter());
146+
}
147+
148+
protected JsonMergePatchSerializer(Converter<Object,?> converter,
149+
JavaType delegateType, JsonSerializer<?> delegateSerialize) {
150+
super(converter, delegateType, delegateSerialize);
151+
}
152+
153+
@Override
154+
protected StdDelegatingSerializer withDelegate(Converter<Object,?> converter,
155+
JavaType delegateType, JsonSerializer<?> delegateSerializer) {
156+
return new JsonMergePatchSerializer(converter, delegateType, delegateSerializer);
157+
}
158+
159+
static class PatchConverter
160+
extends StdConverter<JsonMergePatch, JsonValue>
161+
{
162+
@Override
163+
public JsonValue convert(JsonMergePatch value) {
164+
return value.toJsonValue();
165+
}
166+
}
167+
}
97168
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.fasterxml.jackson.datatype.jsr353;
2+
3+
import javax.json.JsonMergePatch;
4+
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
7+
public class JsonMergePatchSerializationTest extends TestBase
8+
{
9+
private static final ObjectMapper MAPPER = newMapper();
10+
11+
public void testSimpleSerialization() throws Exception
12+
{
13+
// First need a patch so deserialization must work
14+
final String input = "{" +
15+
"\"name\":\"Json\"" +
16+
"}";
17+
final JsonMergePatch patch1 = MAPPER.readValue(input, JsonMergePatch.class);
18+
final String output = MAPPER.writeValueAsString(patch1);
19+
20+
// and read back
21+
final JsonMergePatch patch2 = MAPPER.readValue(output, JsonMergePatch.class);
22+
assertEquals(patch1.toJsonValue(), patch2.toJsonValue());
23+
}
24+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fasterxml.jackson.datatype.jsr353;
2+
3+
import javax.json.JsonPatch;
4+
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
7+
public class JsonPatchSerializationTest extends TestBase
8+
{
9+
private static final ObjectMapper MAPPER = newMapper();
10+
11+
public void testSimpleSerialization() throws Exception
12+
{
13+
// First need a patch so deserialization must work
14+
final String input = "[" +
15+
"{" +
16+
"\"op\":\"replace\"," +
17+
"\"path\":\"/name\"," +
18+
"\"value\":\"Json\"" +
19+
"}" +
20+
"]";
21+
final JsonPatch jsonPatch = MAPPER.readValue(input, JsonPatch.class);
22+
final String output = MAPPER.writeValueAsString(jsonPatch);
23+
24+
// and read back
25+
final JsonPatch jsonPatch2 = MAPPER.readValue(output, JsonPatch.class);
26+
assertEquals(jsonPatch, jsonPatch2);
27+
}
28+
}

release-notes/CREDITS-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,8 @@ Andrzej Pańkowski (apankowski@github)
3939

4040
* Contributed #17: Add configurable amount representations for Joda Money module
4141
(2.14.0)
42+
43+
Matt Nelson (mattnelson@github)
44+
45+
* Suggested #28: Add delegating serializers for `JsonPatch` and `JsonMergePatch`
46+
(2.14.2)

release-notes/VERSION-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ Modules:
1010
=== Releases ===
1111
------------------------------------------------------------------------
1212

13+
2.14.2 (not yet released)
14+
15+
#28: Add delegating serializers for `JsonPatch` and `JsonMergePatch`
16+
(requested by Matt N)
17+
1318
2.14.1 (21-Nov-2022)
1419

1520
No changes since 2.14.0

0 commit comments

Comments
 (0)