Package com.cedarsoftware.util.io
Class JsonWriter
java.lang.Object
com.cedarsoftware.util.io.JsonWriter
- All Implemented Interfaces:
WriterContext
,Closeable
,Flushable
,AutoCloseable
Output a Java object graph in JSON format. This code handles cyclic
references and can serialize any Object graph without requiring a class
to be 'Serializable' or have any specific methods on it.
-
Call the static method:
JsonWriter.objectToJson(employee)
. This will convert the passed in 'employee' instance into a JSON String. - Using streams:
JsonWriter writer = new JsonWriter(stream); writer.write(employee); writer.close();
This will write the 'employee' object to the passed in OutputStream.
That's it. This can be used as a debugging tool. Output an object
graph using the above code. Use the JsonWriter PRETTY_PRINT option to
format the JSON to be human-readable.
This will output any object graph deeply (or null). Object references are properly handled. For example, if you had A->B, B->C, and C->A, then A will be serialized with a B object in it, B will be serialized with a C object in it, and then C will be serialized with a reference to A (ref), not a redefinition of A.
- 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
Modifier and TypeClassDescriptionstatic interface
Implement this interface to customize the JSON output for a given class. -
Constructor Summary
ConstructorDescriptionJsonWriter
(OutputStream out) JsonWriter
(OutputStream out, WriteOptions writeOptions) -
Method Summary
Modifier and TypeMethodDescriptionvoid
close()
static boolean
Ensure that all keys within the Map are String instancesvoid
flush()
void
newLine()
Add newline (\n) to outputvoid
tabIn()
Tab the output left (less indented)void
tabOut()
Tab the output right (more indented)protected void
traceFields
(Deque<Object> stack, Object obj) Reach-ability trace to visit all objects within the graph to be written.protected void
traceReferences
(Object root) Walk object graph and visit each instance, following each field, each Collection, Map and so on.void
Write the passed in Java object in JSON format.boolean
writeArrayElementIfMatching
(Class<?> arrayComponentClass, Object o, boolean showType, Writer output) Write the passed in array element to the JSON output, if any only if, there is a custom writer for the class of the instance 'o'.static void
writeBasicString
(Writer writer, String s) Writes out a string without special characters.protected boolean
writeCustom
(Class<?> arrayComponentClass, Object o, boolean showType, Writer output) Perform the actual custom writing for an array element that has a custom writer.void
Main entry point (mostly used internally, but may be called from a Custom JSON writer).static void
writeJsonUtf8String
(Writer output, String s) Write out special characters "\b, \f, \t, \n, \r", as such, backslash as \\ quote as \" and values less than an ASCII space (20hex) as "\\u00xx" format, characters in the range of ASCII space to a '~' as ASCII, and anything higher in UTF-8.void
writeObject
(Object obj, boolean showType, boolean bodyOnly) Allows you to use the current JsonWriter to write an object out.boolean
writeUsingCustomWriter
(Object o, boolean showType, Writer output) Write the passed in object (o) to the JSON output stream, if and only if, there is a custom writer associated to the Class of object (o).Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.cedarsoftware.util.io.WriterContext
getWriteOptions
-
Constructor Details
-
JsonWriter
- Parameters:
out
- OutputStream to which the JSON will be written. Uses the default WriteOptions.- See Also:
-
JsonWriter
- Parameters:
out
- OutputStream to which the JSON output will be written.writeOptions
- WriteOptions containing many feature options to control the JSON output. Can be null, in which case the default WriteOptions will be used.- See Also:
-
-
Method Details
-
tabIn
Tab the output left (less indented)- Throws:
IOException
-
newLine
Add newline (\n) to output- Throws:
IOException
-
tabOut
Tab the output right (more indented)- Throws:
IOException
-
writeUsingCustomWriter
Write the passed in object (o) to the JSON output stream, if and only if, there is a custom writer associated to the Class of object (o).- Parameters:
o
- Object to be (potentially written)showType
- boolean indicating whether to show @type.output
- Writer where the actual JSON is being written to.- Returns:
- boolean true if written, false is there is no custom writer for the passed in object.
-
writeArrayElementIfMatching
public boolean writeArrayElementIfMatching(Class<?> arrayComponentClass, Object o, boolean showType, Writer output) Write the passed in array element to the JSON output, if any only if, there is a custom writer for the class of the instance 'o'.- Parameters:
arrayComponentClass
- Class type of the arrayo
- Object instance to writeshowType
- boolean indicating whether @type should be output.output
- Writer to write the JSON to (if there is a custom writer for o's Class).- Returns:
- true if the array element was written, false otherwise.
-
writeCustom
protected boolean writeCustom(Class<?> arrayComponentClass, Object o, boolean showType, Writer output) throws IOException Perform the actual custom writing for an array element that has a custom writer.- Parameters:
arrayComponentClass
- Class type of the arrayo
- Object instance to writeshowType
- boolean indicating whether @type should be output.output
- Writer to write the JSON to (if there is a custom writer for o's Class).- Returns:
- true if the array element was written, false otherwise.
- Throws:
IOException
-
write
Write the passed in Java object in JSON format.- Parameters:
obj
- Object any Java Object or JsonObject.
-
traceReferences
Walk object graph and visit each instance, following each field, each Collection, Map and so on. Tracks visited to handle cycles and to determine if an item is referenced elsewhere. If an object is never referenced more than once, no @id field needs to be emitted for it.- Parameters:
root
- Object to be deeply traced. The objVisited and objsReferenced Maps will be written to during the trace.
-
traceFields
Reach-ability trace to visit all objects within the graph to be written. This API will handle any object, using either reflection APIs or by consulting a specified includedFields map if provided.- Parameters:
stack
- Deque used to manage descent into graph (rather than using Java stack.) This allows for much larger graph processing.obj
- Object root of graph the JDK reflection operations. This allows a subset of the actual fields on an object to be serialized.
-
writeImpl
Main entry point (mostly used internally, but may be called from a Custom JSON writer). This method will write out whatever object type it is given, including JsonObject's. It will handle null, detecting if a custom writer should be called, array, array of JsonObject, Map, Map of JsonObjects, Collection, Collection of JsonObject, any regular object, or a JsonObject representing a regular object.- Parameters:
obj
- Object to be writtenshowType
- if set to true, the @type tag will be output. If false, it will be- Throws:
IOException
- if one occurs on the underlying output stream.
-
ensureJsonPrimitiveKeys
Ensure that all keys within the Map are String instances- Parameters:
map
- Map to inspect that all keys are primitive. This allows the output JSON to be optimized into {"key1":value1, "key2": value2} format if all the keys of the Map are Strings. If not, then a Map is written as two arrays, a @keys array and an @items array. This allows support for Maps with non-String keys.
-
writeObject
Description copied from interface:WriterContext
Allows you to use the current JsonWriter to write an object out.- Specified by:
writeObject
in interfaceWriterContext
- Parameters:
obj
- Object to be written in JSON formatshowType
- boolean true means show the "@type" field, false eliminates it. Many times the type can be dropped because it can be inferred from the field or array type.bodyOnly
- write only the body of the object- Throws:
IOException
- if an error occurs writing to the output stream.
-
flush
public void flush() -
close
public void close()- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
-
writeBasicString
Writes out a string without special characters. Use for labels, etc. when you know you will not need extra formattting for UTF-8 or tabs, quotes and newlines in the string- Parameters:
writer
- Writer to which the UTF-8 string will be written tos
- String to be written in UTF-8 format on the output stream.- Throws:
IOException
- if an error occurs writing to the output stream.
-
writeJsonUtf8String
Write out special characters "\b, \f, \t, \n, \r", as such, backslash as \\ quote as \" and values less than an ASCII space (20hex) as "\\u00xx" format, characters in the range of ASCII space to a '~' as ASCII, and anything higher in UTF-8.- Parameters:
output
- Writer to which the UTF-8 string will be written tos
- String to be written in UTF-8 format on the output stream.- Throws:
IOException
- if an error occurs writing to the output stream.
-