Skip to content

Commit 58d8893

Browse files
patveckcowtowncoder
authored andcommitted
Ensure JSON patch is an array of objects
1 parent 175085b commit 58d8893

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

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

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package com.fasterxml.jackson.datatype.jsr353;
22

33
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonToken;
45
import com.fasterxml.jackson.databind.DeserializationContext;
56
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
7+
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
68
import com.fasterxml.jackson.databind.type.LogicalType;
79

810
import javax.json.Json;
11+
import javax.json.JsonArray;
912
import javax.json.JsonPatch;
13+
import javax.json.JsonValue;
14+
import javax.json.JsonValue.ValueType;
1015
import java.io.IOException;
1116

1217
public class JsonPatchDeserializer extends StdDeserializer<JsonPatch> {
@@ -25,7 +30,19 @@ public LogicalType logicalType() {
2530

2631
@Override
2732
public JsonPatch deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
28-
return Json.createPatch(jsonValueDeser._deserializeArray(p, ctxt));
33+
if (p.currentToken() != JsonToken.START_ARRAY) {
34+
throw getException(p, p.getText());
35+
}
36+
final JsonArray patch = jsonValueDeser._deserializeArray(p, ctxt);
37+
for (final JsonValue element : patch.getValuesAs(JsonValue.class)) {
38+
if (element.getValueType() != ValueType.OBJECT) {
39+
throw getException(p, element.toString());
40+
}
41+
}
42+
return Json.createPatch(patch);
2943
}
3044

45+
private InvalidFormatException getException(final JsonParser p, final String value) {
46+
return InvalidFormatException.from(p, "JSON patch has to be an array of objects", value, handledType());
47+
}
3148
}

0 commit comments

Comments
 (0)