Class JsonReader

java.lang.Object
com.cedarsoftware.util.io.JsonReader
All Implemented Interfaces:
Closeable, AutoCloseable

public class JsonReader extends Object implements Closeable
Read an object graph in JSON format and make it available in Java objects, or in a "Map of Maps." (untyped representation). This code handles cyclic references and can deserialize any Object graph without requiring a class to be 'Serializeable' or have any specific methods on it. It will handle classes with non-public constructors.

Usages:
  • Call the static method: JsonReader.jsonToJava(String json). This will return a typed Java object graph.
  • Call the static method: JsonReader.jsonToMaps(String json). This will return an untyped object representation of the JSON String as a Map of Maps, where the fields are the Map keys, and the field values are the associated Map's values. You can call the JsonWriter.objectToJson() method with the returned Map, and it will serialize the Graph into the equivalent JSON stream from which it was read.
  • Instantiate the JsonReader with an InputStream: JsonReader(InputStream in) and then call readObject(). Cast the return value of readObject() to the Java class that was the root of the graph.
  • Instantiate the JsonReader with an InputStream: JsonReader(InputStream in, true) and then call readObject(). The return value will be a Map of Maps.

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.
  • Field Details

    • CUSTOM_READER_MAP

      public static final String CUSTOM_READER_MAP
      If set, this maps class ==> CustomReader
      See Also:
    • NOT_CUSTOM_READER_MAP

      public static final String NOT_CUSTOM_READER_MAP
      If set, this indicates that no custom reader should be used for the specified class ==> CustomReader
      See Also:
    • USE_MAPS

      public static final String USE_MAPS
      If set, the read-in JSON will be turned into a Map of Maps (JsonObject) representation
      See Also:
    • UNKNOWN_OBJECT

      public static final String UNKNOWN_OBJECT
      What to do when an object is found and 'type' cannot be determined.
      See Also:
    • FAIL_ON_UNKNOWN_TYPE

      public static final String FAIL_ON_UNKNOWN_TYPE
      Will fail JSON parsing if 'type' class defined but is not on classpath.
      See Also:
    • JSON_READER

      public static final String JSON_READER
      Pointer to 'this' (automatically placed in the Map)
      See Also:
    • OBJECT_RESOLVER

      public static final String OBJECT_RESOLVER
      Pointer to the current ObjectResolver (automatically placed in the Map)
      See Also:
    • TYPE_NAME_MAP

      public static final String TYPE_NAME_MAP
      If set, this map will be used when reading @type values - allows shorthand abbreviations type names
      See Also:
    • MISSING_FIELD_HANDLER

      public static final String MISSING_FIELD_HANDLER
      If set, this object will be called when a field is present in the JSON but missing from the corresponding class
      See Also:
    • CLASSLOADER

      public static final String CLASSLOADER
      If set, use the specified ClassLoader
      See Also:
    • FACTORIES

      public static final String FACTORIES
      If set, this map will contain Factory classes for creating hard to instantiate objects.
      See Also:
  • Constructor Details

    • JsonReader

      @Deprecated public JsonReader(int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(ReadOptions)
      Parameters:
      maxDepth - - maximum recursion depth
    • JsonReader

      @Deprecated public JsonReader()
      Deprecated.
      Deprecated - use JsonReader(ReadOptions)
    • JsonReader

      @Deprecated public JsonReader(InputStream inputStream, int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(InputStream, ReadOptions)
      Parameters:
      inputStream - - input stream to supply json
      maxDepth - - maximum recursion depth
    • JsonReader

      @Deprecated public JsonReader(InputStream inputStream)
      Deprecated.
      Deprecated - use JsonReader(InputStream, ReadOptions)
      Parameters:
      inputStream - input stream
    • JsonReader

      @Deprecated public JsonReader(Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(ReadOptions) Use this constructor if you already have a JsonObject graph and want to parse it into Java objects by calling jsonReader.jsonObjectsToJava(rootJsonObject) after constructing the JsonReader.
      Parameters:
      optionalArgs - Map of optional arguments for the JsonReader.
      maxDepth - Maximum parsing depth.
    • JsonReader

      @Deprecated public JsonReader(Map<String,Object> optionalArgs)
      Deprecated.
      Deprecated - use JsonReader(ReadOptions) Use this constructor if you already have a JsonObject graph and want to parse it into Java objects by calling jsonReader.jsonObjectsToJava(rootJsonObject) after constructing the JsonReader.
      Parameters:
      optionalArgs - Map of optional arguments for the JsonReader.
    • JsonReader

      @Deprecated public JsonReader(InputStream inputStream, boolean useMaps, int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(InputStream, ReadOptions)
      Parameters:
      inputStream - - json String
      useMaps - - return data in map of maps
      maxDepth - - maximum recursion depth
    • JsonReader

      @Deprecated public JsonReader(InputStream inputStream, boolean useMaps)
      Deprecated.
      Deprecated - use JsonReader(InputStream, ReadOptions)
      Parameters:
      inputStream - - json String
      useMaps - - return data in map of maps
    • JsonReader

      @Deprecated public JsonReader(InputStream inputStream, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(InputStream, ReadOptions)
      Parameters:
      inputStream - - json String
      optionalArgs - - old way of passing reader arguments
      maxDepth - - max recursion depth
    • JsonReader

      @Deprecated public JsonReader(InputStream inputStream, Map<String,Object> optionalArgs)
      Deprecated.
      Deprecated - use JsonReader(InputStream, ReadOptions)
      Parameters:
      inputStream - - json String
      optionalArgs - - old way of passing reader arguments
    • JsonReader

      @Deprecated public JsonReader(String json, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(String, ReadOptions)
      Parameters:
      json - - json String
      optionalArgs - - old way of passing reader arguments
      maxDepth - - max recursion depth
    • JsonReader

      @Deprecated public JsonReader(String json, Map<String,Object> optionalArgs)
      Deprecated.
      Deprecated - use JsonReader(String, ReadOptions)
      Parameters:
      json - - json String
      optionalArgs - - old way of passing reader arguments
    • JsonReader

      @Deprecated public JsonReader(byte[] inp, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Deprecated - use JsonReader(byte[], ReadOptions)
      Parameters:
      inp - - byte array with json data in it.
      optionalArgs - - deprecated options.
      maxDepth - - max recursion depth
    • JsonReader

      @Deprecated public JsonReader(byte[] inp, Map<String,Object> optionalArgs)
      Deprecated.
      Deprecated - use JsonReader(byte[], ReadOptions)
      Parameters:
      inp - - byte array with json data in it.
      optionalArgs - - deprecated options.
    • JsonReader

      public JsonReader(String json)
      Creates a json reader using default read options
      Parameters:
      json - - json String
    • JsonReader

      public JsonReader(String json, ReadOptions readOptions)
      Creates a json reader using custom read options
      Parameters:
      json - json String
      readOptions - Read Options
    • JsonReader

      public JsonReader(byte[] bytes, ReadOptions readOptions)
      Creates a json reader using custom read options
      Parameters:
      bytes - utf-8 encoded bytes
      readOptions - Read Options
    • JsonReader

      public JsonReader(InputStream inp, ReadOptions readOptions)
      Creates a json reader using custom read options
      Parameters:
      inp - InputStream of utf-encoded json
      readOptions - Read Options
    • JsonReader

      public JsonReader(ReadOptions options)
      Use this constructor if you already have a JsonObject graph and want to parse it into Java objects by calling jsonReader.jsonObjectsToJava(rootJsonObject) after constructing the JsonReader.
      Parameters:
      options - - read options
  • Method Details

    • assignInstantiator

      @Deprecated public static void assignInstantiator(String className, JsonReader.ClassFactory factory)
      Deprecated.
      Deprecated - use ReadOptionsBuilder.assignInstantiator(String, ClassFactory)
      Parameters:
      className - Class name to assign an ClassFactory to
      factory - ClassFactory that will create 'c' instances
    • assignInstantiator

      @Deprecated public static void assignInstantiator(Class<?> c, JsonReader.ClassFactory factory)
      Deprecated.
      Deprecated - use ReadOptionsBuilder.assignInstantiator(Class, ClassFactory)
      Parameters:
      c - Class to assign on ClassFActory
      factory - ClassFactory that wil create instance of that class.
    • addReader

      @Deprecated public void addReader(Class<?> c, JsonReader.JsonClassReader reader)
      Deprecated.
      use ReadOptionsBuilder.withCustomReader() to create any additional readers you'll need.
      Call this method to add a custom JSON reader to json-io. It will associate the Class 'c' to the reader you pass in. The readers are found with isAssignableFrom(). If this is too broad, causing too many classes to be associated to the custom reader, you can indicate that json-io should not use a custom reader for a particular class, by calling the addNotCustomReader() method.
      Parameters:
      c - Class to assign a custom JSON reader to
      reader - The JsonClassReader which will read the custom JSON format of 'c'
    • addNotCustomReader

      @Deprecated public void addNotCustomReader(Class<?> c)
      Deprecated.
      use ReadOptionsBuilder.withNonCustomizableClass()
      Force json-io to use it's internal generic approach to writing the passed in class, even if a Custom JSON reader is specified for its parent class.
      Parameters:
      c - Class to which to force no custom JSON reading to occur.
    • toObjects

      public static <T> T toObjects(InputStream input, ReadOptions options)
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      input - Input stream of UTF-8 json string data
      options - Read options
      Returns:
      Java object graph matching JSON input
    • toObjects

      public static <T> T toObjects(byte[] bytes, ReadOptions options)
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      bytes - UTF-8 byte array
      options - Read options
      Returns:
      Java object graph matching JSON input
    • toObjects

      public static <T> T toObjects(String jsonString, ReadOptions options)
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      jsonString - String JSON input
      options - Read options
      Returns:
      Java object graph matching JSON input
    • toObjects

      public static <T> T toObjects(String json)
      Convert the passed in JSON string into a Java object graph. Uses the default read options
      Parameters:
      json - String JSON input
      Returns:
      Java object graph matching JSON input
    • jsonToJava

      @Deprecated public static <T> T jsonToJava(String json)
      Deprecated.
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      json - String JSON input
      Returns:
      Java object graph matching JSON input
    • jsonToJava

      @Deprecated public static Object jsonToJava(String json, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      json - String JSON input
      optionalArgs - Map of optional parameters to control parsing. See readme file for details.
      maxDepth - Maximum parsing depth.
      Returns:
      Java object graph matching JSON input
    • jsonToJava

      @Deprecated public static <T> T jsonToJava(String json, Map<String,Object> optionalArgs)
      Deprecated.
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      json - String JSON input
      optionalArgs - Map of optional parameters to control parsing. See readme file for details.
      Returns:
      Java object graph matching JSON input
    • jsonToJava

      @Deprecated public static <T> T jsonToJava(InputStream inputStream, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      inputStream - InputStream containing JSON input
      optionalArgs - Map of optional parameters to control parsing. See readme file for details.
      maxDepth - Maximum parsing depth.
      Returns:
      Java object graph matching JSON input
    • jsonToJava

      @Deprecated public static <T> T jsonToJava(InputStream inputStream, Map<String,Object> optionalArgs)
      Deprecated.
      Convert the passed in JSON string into a Java object graph.
      Parameters:
      inputStream - InputStream containing JSON input
      optionalArgs - Map of optional parameters to control parsing. See readme file for details.
      Returns:
      Java object graph matching JSON input
    • jsonToMaps

      @Deprecated public static Map jsonToMaps(String json, int maxDepth)
      Deprecated.
      Deprecated = use toMaps(String, ReadOptions); Map args = ["USE_MAPS": true] Use JsonReader.jsonToJava(String json, args) Note that the return type will match the JSON type (array, object, string, long, boolean, or null). No longer recommended: Use jsonToJava with USE_MAPS:true
      Parameters:
      json - String of JSON content
      maxDepth - Maximum parsing depth.
      Returns:
      Map representing JSON content. Each object is represented by a Map.
    • jsonToMaps

      @Deprecated public static Map jsonToMaps(String json)
      Deprecated.
      Deprecated = use toMaps(String, ReadOptions); Map args = ["USE_MAPS": true] Use JsonReader.jsonToJava(String json, args) Note that the return type will match the JSON type (array, object, string, long, boolean, or null). No longer recommended: Use jsonToJava with USE_MAPS:true
      Parameters:
      json - String of JSON content
      Returns:
      Map representing JSON content. Each object is represented by a Map.
    • jsonToMaps

      @Deprecated public static Map jsonToMaps(String json, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Deprecated = use toMaps(String, ReadOptions); Map args = ["USE_MAPS": true] Use JsonReader.jsonToJava(String json, args) Note that the return type will match the JSON type (array, object, string, long, boolean, or null). No longer recommended: Use jsonToJava with USE_MAPS:true
      Parameters:
      json - String of JSON content
      optionalArgs - Map of optional arguments to control customization. See readme file for details on these options.
      maxDepth - Maximum parsing depth.
      Returns:
      Map where each Map representa an object in the JSON input.
    • jsonToMaps

      @Deprecated public static Map jsonToMaps(String json, Map<String,Object> optionalArgs)
      Deprecated.
      Deprecated = use toMaps(String, ReadOptions); Map args = ["USE_MAPS": true] Use JsonReader.jsonToJava(String json, args) Note that the return type will match the JSON type (array, object, string, long, boolean, or null). No longer recommended: Use jsonToJava with USE_MAPS:true
      Parameters:
      json - String of JSON content
      optionalArgs - Map of optional arguments to control customization. See readme file for details on these options.
      Returns:
      Map where each Map representa an object in the JSON input.
    • jsonToMaps

      @Deprecated public static Map jsonToMaps(InputStream inputStream, Map<String,Object> optionalArgs, int maxDepth)
      Deprecated.
      Deprecated = use toMaps(InputStream, ReadOptions); Map args = ["USE_MAPS": true] Use JsonReader.jsonToJava(inputStream, args) Note that the return type will match the JSON type (array, object, string, long, boolean, or null). No longer recommended: Use jsonToJava with USE_MAPS:true
      Parameters:
      inputStream - containing JSON content
      optionalArgs - Map of optional arguments to control customization. See readme file for details on these options.
      maxDepth - Maximum parsing depth.
      Returns:
      Map containing the content from the JSON input. Each Map represents an object from the input.
    • jsonToMaps

      @Deprecated public static Map jsonToMaps(InputStream inputStream, Map<String,Object> optionalArgs)
      Deprecated.
      Deprecated = use toMaps(InputStream, ReadOptions); Map args = ["USE_MAPS": true] Use JsonReader.jsonToJava(inputStream, args) Note that the return type will match the JSON type (array, object, string, long, boolean, or null). No longer recommended: Use jsonToJava with USE_MAPS:true
      Parameters:
      inputStream - containing JSON content
      optionalArgs - Map of optional arguments to control customization. See readme file for details on these options.
      Returns:
      Map containing the content from the JSON input. Each Map represents an object from the input.
    • toMaps

      public static <T> T toMaps(String json)
      Note that the return type will match one of these JSON types (array, Map, string, long, boolean, or null).
      Parameters:
      json - json string
      Returns:
      Map containing the content from the JSON input. Each Map represents an object from the input.
    • toMaps

      public static <T> T toMaps(String json, ReadOptions readOptions)
      Note that the return type will match one of these JSON types (array, Map, string, long, boolean, or null).
      Parameters:
      json - json string
      readOptions - options to use when reading
      Returns:
      Map containing the content from the JSON input. Each Map represents an object from the input.
    • toMaps

      public static <T> T toMaps(InputStream inputStream, ReadOptions readOptions)
      Note that the return type will match one of these JSON types (array, Map, string, long, boolean, or null).
      Parameters:
      inputStream - bytes representing UTF-8 string
      readOptions - options to use when reading
      Returns:
      Map containing the content from the JSON input. Each Map represents an object from the input.
    • getReader

      protected FastReader getReader(InputStream inputStream)
    • readObject

      public Object readObject()
      Read JSON input from the stream that was set up in the constructor, turning it into Java Maps (JsonObject's). Then, if requested, the JsonObjects can be converted into Java instances.
      Returns:
      Java Object graph constructed from InputStream supplying JSON serialized content.
    • jsonObjectsToJava

      @Deprecated public Object jsonObjectsToJava(JsonObject root)
      Deprecated.
      Convert a root JsonObject that represents parsed JSON, into an actual Java object.
      Parameters:
      root - JsonObject instance that was the root object from the JSON input that was parsed in an earlier call to JsonReader.
      Returns:
      a typed Java instance that was serialized into JSON.
    • useMaps

      protected boolean useMaps()
    • convertParsedMapsToJava

      public <T> T convertParsedMapsToJava(JsonObject root, Class<T> hint)
      This method converts a root Map, (which contains nested Maps and so forth representing a Java Object graph), to a Java object instance. The root map came from using the JsonReader to parse a JSON graph (using the API that puts the graph into Maps, not the typed representation).
      Parameters:
      root - JsonObject instance that was the root object from the
      hint - When you know the type you will be returning. JSON input that was parsed in an earlier call to JsonReader.
      Returns:
      a typed Java instance that was serialized into JSON.
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable