Class MapResolver
The MapResolver converts the raw Maps created from the JsonParser to higher
quality Maps representing the implied object graph. It does this by replacing
@ref
values with the Map indicated by the @id key with the same value.
This approach 'wires' the original object graph. During the resolution process, if 'peer' classes can be found for given Maps (for example, an @type entry is available which indicates the class that would have been associated to the Map, then the associated class is consulted to help 'improve' the quality of the primitive values within the map fields. For example, if the peer class indicated that a field was of type 'short', and the Map had a long value (JSON only returns long's for integer types), then the long would be converted to a short.
The final Map representation is a very high-quality graph that represents the original JSON graph. It can be passed as input to JsonWriter, and the JsonWriter will write out the equivalent JSON to what was originally read. This technique allows json-io to be used on a machine that does not have any of the Java classes from the original graph, read it in a JSON graph (any JSON graph), return the equivalent maps, allow mutations of those maps, and finally this graph can be written out.
- 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
License
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 classes/interfaces inherited from class com.cedarsoftware.io.Resolver
Resolver.Missingfields
-
Field Summary
Fields inherited from class com.cedarsoftware.io.Resolver
sealedSupplier, stack
-
Constructor Summary
ModifierConstructorDescriptionprotected
MapResolver
(ReadOptions readOptions, ReferenceTracker references, com.cedarsoftware.util.convert.Converter converter) -
Method Summary
Modifier and TypeMethodDescriptionvoid
assignField
(JsonObject jsonObj, Injector injector, Object rhs) protected Object
readWithFactoryIfExists
(Object o, Class<?> compType) protected void
traverseArray
(JsonObject jsonObj) protected void
traverseCollection
(JsonObject jsonObj) Process java.util.Collection and it's derivatives.void
traverseFields
(JsonObject jsonObj) Walk the JsonObject fields and perform necessary substitutions so that all references matched up.Methods inherited from class com.cedarsoftware.io.Resolver
cleanup, getConverter, getReadOptions, getReferences, isConvertable, push, toJavaObjects, traverseJsonObject, traverseMap, traverseSpecificType, valueToTarget
-
Constructor Details
-
MapResolver
protected MapResolver(ReadOptions readOptions, ReferenceTracker references, com.cedarsoftware.util.convert.Converter converter)
-
-
Method Details
-
readWithFactoryIfExists
- Specified by:
readWithFactoryIfExists
in classResolver
-
traverseFields
Walk the JsonObject fields and perform necessary substitutions so that all references matched up. This code patches @ref and @id pairings up, in the 'Map of Map' mode. Where the JSON may contain an '@id' of an object which can have more than one @ref to it, this code will make sure that each '@ref' (value side of the Map associated to a given field name) will be pointer to the appropriate Map instance.- Specified by:
traverseFields
in classResolver
- Parameters:
jsonObj
- a Map-of-Map representation of the current object being examined (containing all fields).
-
traverseCollection
Process java.util.Collection and it's derivatives. Collections are written specially so that the serialization does not expose the Collection's internal structure, for example a TreeSet. All entries are processed, except unresolved references, which are filled in later. For an indexable collection, the unresolved references are set back into the proper element location. For non-indexable collections (Sets), the unresolved references are added via .add().- Specified by:
traverseCollection
in classResolver
- Parameters:
jsonObj
- a Map-of-Map representation of the JSON input stream.
-
traverseArray
- Specified by:
traverseArray
in classResolver
-
assignField
- Specified by:
assignField
in classResolver
-