forked from java-json-tools/json-patch
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathJsonMergePatchDeserializer.java
87 lines (76 loc) · 2.55 KB
/
JsonMergePatchDeserializer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Copyright (c) 2014, Francis Galiegue ([email protected])
*
* This software is dual-licensed under:
*
* - the Lesser General Public License (LGPL) version 3.0 or, at your option, any
* later version;
* - the Apache Software License (ASL) version 2.0.
*
* The text of this file and of both licenses is available at the root of this
* project or, if you have the jar distribution, in directory META-INF/, under
* the names LGPL-3.0.txt and ASL-2.0.txt respectively.
*
* Direct link to the sources:
*
* - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt
* - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
*/
package com.gravity9.jsonpatch.mergepatch;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.NullNode;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
final class JsonMergePatchDeserializer extends JsonDeserializer<JsonMergePatch> {
@Override
public JsonMergePatch deserialize(final JsonParser jp,
final DeserializationContext ctxt) throws IOException {
ObjectMapper mapper = new ObjectMapper().setConfig(ctxt.getConfig());
jp.setCodec(mapper);
final JsonNode node = jp.readValueAsTree();
/*
* Not an object: the simple case
*/
if (!node.isObject()) {
return new NonObjectMergePatch(node);
}
/*
* The complicated case...
*
* We have to build a set of removed members, plus a map of modified
* members.
*/
final Set<String> removedMembers = new HashSet<>();
final Map<String, JsonMergePatch> modifiedMembers = new HashMap<>();
final Iterator<Map.Entry<String, JsonNode>> iterator = node.fields();
Map.Entry<String, JsonNode> entry;
while (iterator.hasNext()) {
entry = iterator.next();
if (entry.getValue().isNull())
removedMembers.add(entry.getKey());
else {
final JsonMergePatch value
= deserialize(entry.getValue().traverse(), ctxt);
modifiedMembers.put(entry.getKey(), value);
}
}
return new ObjectMergePatch(removedMembers, modifiedMembers);
}
/*
* This method MUST be overriden... The default is to return null, which is
* not what we want.
*/
@Override
@SuppressWarnings("deprecation")
public JsonMergePatch getNullValue() {
return new NonObjectMergePatch(NullNode.getInstance());
}
}