Package com.cedarsoftware.util.io
Class Resolver
java.lang.Object
com.cedarsoftware.util.io.Resolver
- Direct Known Subclasses:
MapResolver
,ObjectResolver
This class is used to convert a source of Java Maps that were created from
the JsonParser. These are in 'raw' form with no 'pointers'. This code will
reconstruct the 'shape' of the graph by connecting @ref's to @ids.
The subclasses that override this class can build an object graph using Java
classes or a Map-of-Map representation. In both cases, the @ref value will
be replaced with the Object (or Map) that had the corresponding @id.
- Author:
- John DeRegnaucourt ([email protected])
Copyright (c) Cedar Software LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static class
stores missing fields information to notify client after the complete deserialization resolution -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected void
cleanup()
protected Object
coerceCertainTypes
(String type) protected <T> T
Walk a JsonObject (Map of String keys to values) and return the Java object equivalent filled in as best as possible (everything except unresolved reference fields or unresolved array/collection elements).protected static void
Convert an input JsonObject map (known to represent a Map.class or derivative) that has regular keys and values to have its keys placed into @keys, and its values placed into @items.protected Object
createInstance
(Class clazz, JsonObject jsonObj) This method creates a Java Object instance based on the passed in parameters.protected Object
createInstanceUsingClass
(Class clazz, JsonObject jsonObj) Create an instance using the Class (clazz) provided and the values in the jsonObj.protected Object
createInstanceUsingType
(JsonObject jsonObj) Create an instance of a Java class using the ".type" field on the jsonObj.protected EnumSet<?>
extractEnumSet
(Class c, JsonObject jsonObj) protected JsonReader.JsonClassReader
protected JsonReader
Deprecated.protected void
For all fields where the value was "@ref":"n" where 'n' was the id of an object that had not yet been encountered in the stream, make the final substitution.protected abstract Object
readWithFactoryIfExists
(Object o, Class compType, Deque<JsonObject> stack) protected void
Process Maps/Sets (fix up their internal indexing structure) This is required because Maps hash items using hashCode(), which will change between VMs.protected abstract void
traverseArray
(Deque<JsonObject> stack, JsonObject jsonObj) protected abstract void
traverseCollection
(Deque<JsonObject> stack, JsonObject jsonObj) abstract void
traverseFields
(Deque<JsonObject> stack, JsonObject jsonObj) abstract void
traverseFields
(Deque<JsonObject> stack, JsonObject jsonObj, Set<String> excludeFields) protected void
traverseMap
(Deque<JsonObject> stack, JsonObject jsonObj) Process java.util.Map and it's derivatives.
-
Field Details
-
missingFields
-
-
Constructor Details
-
Resolver
-
-
Method Details
-
getReader
Deprecated. -
convertMapsToObjects
Walk a JsonObject (Map of String keys to values) and return the Java object equivalent filled in as best as possible (everything except unresolved reference fields or unresolved array/collection elements).- Parameters:
root
- JsonObject reference to a Map-of-Maps representation of the JSON input after it has been completely read.- Returns:
- Properly constructed, typed, Java object graph built from a Map of Maps representation (JsonObject root).
-
readWithFactoryIfExists
protected abstract Object readWithFactoryIfExists(Object o, Class compType, Deque<JsonObject> stack) -
traverseFields
-
traverseFields
public abstract void traverseFields(Deque<JsonObject> stack, JsonObject jsonObj, Set<String> excludeFields) -
traverseCollection
-
traverseArray
-
cleanup
protected void cleanup() -
traverseMap
Process java.util.Map and it's derivatives. These are written specially so that the serialization does not expose the class internals (internal fields of TreeMap for example).- Parameters:
stack
- a Stack (Deque) used to support graph traversal.jsonObj
- a Map-of-Map representation of the JSON input stream.
-
convertMapToKeysItems
Convert an input JsonObject map (known to represent a Map.class or derivative) that has regular keys and values to have its keys placed into @keys, and its values placed into @items.- Parameters:
map
- Map to convert
-
createInstance
This method creates a Java Object instance based on the passed in parameters. If the JsonObject contains a key '@type' then that is used, as the type was explicitly set in the JSON stream. If the key '@type' does not exist, then the passed in Class is used to create the instance, handling creating an Array or regular Object instance.
The '@type' is not often specified in the JSON input stream, as in many cases it can be inferred from a field reference or array component type.- Parameters:
clazz
- Instance will be create of this class.jsonObj
- Map-of-Map representation of object to create.- Returns:
- a new Java object of the appropriate type (clazz) using the jsonObj to provide enough hints to get the right class instantiated. It is not populated when returned.
-
createInstanceUsingType
Create an instance of a Java class using the ".type" field on the jsonObj. The clazz argument is not used for determining type, just for clarity in an exception message. -
createInstanceUsingClass
Create an instance using the Class (clazz) provided and the values in the jsonObj. -
coerceCertainTypes
-
getCustomReader
-
extractEnumSet
-
patchUnresolvedReferences
protected void patchUnresolvedReferences()For all fields where the value was "@ref":"n" where 'n' was the id of an object that had not yet been encountered in the stream, make the final substitution. -
rehashMaps
protected void rehashMaps()Process Maps/Sets (fix up their internal indexing structure) This is required because Maps hash items using hashCode(), which will change between VMs. Rehashing the map fixes this.
If useMaps==true, then move @keys to keys and @items to values and then drop these two entries from the map.
This hashes both Sets and Maps because the JDK sets are implemented as Maps. If you have a custom built Set, this would not 'treat' it and you would need to provide a custom reader for that set.
-