public class JSONObject
extends java.lang.Object
A JSONObject is an collection of name/value pairs.
This com.purplehillsbooks.json version of the classes enforces alphabetical order on the object members when being serialized. This is done to put the output into a cononical, reproducible form. So that identical JSON objects will produce identical output, and so that if you compare two JSON files, the difference will be more meaningful. Otherwise, the order of the members does not matter.
This com.purplehillsbooks.json version also provides human readible, indented output
when you use the write(stream, indent, offset)
method.
The JSONObject serialized
form is a string wrapped in curly braces with colons between the names and
values, and commas between the values and names. The internal form is an
object having get
and opt
methods for accessing the
values by name, and put
methods for adding or replacing values
by name. The values can be any of these types: Boolean
,
JSONArray
, JSONObject
, Number
,
String
, or the JSONObject.NULL
object. A JSONObject
constructor can be used to convert an external form JSON text into an
internal form whose values can be retrieved with the get
and
opt
methods, or to convert values into a JSON text using the
put
and toString
methods. A get
method
returns a value if one can be found, and throws an exception if one cannot be
found. An opt
method returns a default value instead of throwing
an exception, and so is useful for obtaining optional values.
The generic get()
and opt()
methods return an
object, which you can cast or query for type. There are also typed
get
and opt
methods that do type checking and type
casting for you. The opt methods differ from the get methods in that they do
not throw. Instead, they return a specified default value, such as null or zero.
The put
methods add or replace values in an object. For example,
JSONObject myObj = new JSONObject(); myObj.put("JSON", "Hello, World!"); myObj.write( myWriter );
produces the string {"JSON": "Hello, World"}
.
The texts produced by the write
methods strictly conform to
the JSON syntax rules. The constructors are more forgiving in the texts they
will accept:
,
(comma) may appear just
before the closing brace.'
(single
quote).{ } [ ] / \ : , = ; #
and if they do not look like numbers and
if they are not the reserved words true
, false
, or
null
.=
or =>
as well as by
:
.;
(semicolon) as
well as by ,
(comma).To read from a stream, reader, or string, use the following:
JSONObject jo = new JSONObject( new JSONTokener( input ) );
To read from a file, it is most convenient:
JSONObject jo = JSONObject.readFromFile( file );
If you want to write to a stream, use the write methods on JSON object or array:
jo.write( output ); -or- jo.write( output, 2, 0 );
To write to a file. This is more than just a convenience, this will write to a temporary file, and then only when it is fully written, will delete the existing file, and rename the temp to the new name:
jo.writeToFile( file );
Thus, no matter if the server crashes in the middle of writing, the file being pointed to will always contain valid JSON format contents. If the server crashes in the middle of writing, this may leave "temp" files in the file system.
If you have multiple programs running which will be updating a JSON file, please look into LockableJSONFile for proper file system level locking of JSON files.
Modifier and Type | Field and Description |
---|---|
static java.lang.Object |
NULL
It is sometimes more convenient and less ambiguous to have a
NULL object than to use Java's null value. |
Constructor and Description |
---|
JSONObject()
Construct an empty JSONObject.
|
JSONObject(JSONObject jo,
java.lang.String[] names)
Construct a JSONObject from a subset of another JSONObject.
|
JSONObject(JSONTokener x)
Construct a JSONObject from a JSONTokener.
|
JSONObject(java.lang.Object bean)
Construct a JSONObject from an Object using bean getters.
|
JSONObject(java.lang.String source)
Deprecated.
don't use this, use the JSONTokener
instead. The JSON stream should never be a string, but
instead should always be a Stream. It is always more
efficient to stream the JSON representation in and out.
Never use a string for this.
|
Modifier and Type | Method and Description |
---|---|
JSONObject |
accumulate(java.lang.String key,
java.lang.Object value)
Accumulate values under a key.
|
JSONObject |
append(java.lang.String key,
java.lang.Object value)
Append values to the array under a key.
|
static java.lang.String |
doubleToString(double d)
Produce a string from a double.
|
java.lang.Object |
get(java.lang.String key)
Get the value object associated with a key.
|
boolean |
getBoolean(java.lang.String key)
Get the boolean value associated with a key.
|
double |
getDouble(java.lang.String key)
Get the double value associated with a key.
|
int |
getInt(java.lang.String key)
Get the int value associated with a key.
|
JSONArray |
getJSONArray(java.lang.String key)
Get the JSONArray value associated with a key.
|
JSONObject |
getJSONObject(java.lang.String key)
Get the JSONObject value associated with a key.
|
long |
getLong(java.lang.String key)
Get the long value associated with a key.
|
static java.lang.String[] |
getNames(JSONObject jo)
Get an array of field names from a JSONObject.
|
static java.lang.String[] |
getNames(java.lang.Object object)
Get an array of field names from an Object.
|
java.lang.String |
getString(java.lang.String key)
Get the string associated with a key.
|
boolean |
has(java.lang.String key)
Determine if the JSONObject contains a value at a specific key.
|
JSONObject |
increment(java.lang.String key)
Increment a property of a JSONObject.
|
boolean |
isNull(java.lang.String key)
Determine if the value associated with the key is null or if there is
no value.
|
java.util.Iterator<java.lang.String> |
keys()
Deprecated.
use keySet instead because iterators are old fashioned
|
java.util.Set<java.lang.String> |
keySet() |
int |
length()
Get the number of keys stored in the JSONObject.
|
JSONArray |
names()
Produce a JSONArray containing the names of the elements of this
JSONObject.
|
static java.lang.String |
numberToString(java.lang.Number number)
Produce a string from a Number.
|
java.lang.Object |
opt(java.lang.String key)
Get an optional value associated with a key.
|
boolean |
optBoolean(java.lang.String key)
Get an optional boolean associated with a key.
|
boolean |
optBoolean(java.lang.String key,
boolean defaultValue)
Get an optional boolean associated with a key.
|
double |
optDouble(java.lang.String key)
Get an optional double associated with a key,
or NaN if there is no such key or if its value is not a number.
|
double |
optDouble(java.lang.String key,
double defaultValue)
Get an optional double associated with a key, or the
defaultValue if there is no such key or if its value is not a number.
|
int |
optInt(java.lang.String key)
Get an optional int value associated with a key,
or zero if there is no such key or if the value is not a number.
|
int |
optInt(java.lang.String key,
int defaultValue)
Get an optional int value associated with a key,
or the default if there is no such key or if the value is not a number.
|
JSONArray |
optJSONArray(java.lang.String key)
Get an optional JSONArray associated with a key.
|
JSONObject |
optJSONObject(java.lang.String key)
Get an optional JSONObject associated with a key.
|
long |
optLong(java.lang.String key)
Get an optional long value associated with a key,
or zero if there is no such key or if the value is not a number.
|
long |
optLong(java.lang.String key,
long defaultValue)
Get an optional long value associated with a key,
or the default if there is no such key or if the value is not a number.
|
java.lang.String |
optString(java.lang.String key)
Get an optional string associated with a key.
|
java.lang.String |
optString(java.lang.String key,
java.lang.String defaultValue)
Get an optional string associated with a key.
|
JSONObject |
put(java.lang.String key,
boolean value)
Put a key/boolean pair in the JSONObject.
|
JSONObject |
put(java.lang.String key,
java.util.Collection<?> value)
Put a key/value pair in the JSONObject, where the value will be a
JSONArray which is produced from a Collection.
|
JSONObject |
put(java.lang.String key,
double value)
Put a key/double pair in the JSONObject.
|
JSONObject |
put(java.lang.String key,
int value)
Put a key/int pair in the JSONObject.
|
JSONObject |
put(java.lang.String key,
long value)
Put a key/long pair in the JSONObject.
|
JSONObject |
put(java.lang.String key,
java.util.Map<java.lang.String,?> value)
Put a key/value pair in the JSONObject, where the value will be a
JSONObject which is produced from a Map.
|
JSONObject |
put(java.lang.String key,
java.lang.Object value)
Put a key/value pair in the JSONObject.
|
JSONObject |
putOnce(java.lang.String key,
java.lang.Object value)
Put a key/value pair in the JSONObject, but only if the key and the
value are both non-null, and only if there is not already a member
with that name.
|
JSONObject |
putOpt(java.lang.String key,
java.lang.Object value)
Put a key/value pair in the JSONObject, but only if the
key and the value are both non-null.
|
static java.lang.String |
quote(java.lang.String string)
Produce a string in double quotes with all the characters that need
it encoded properly.
|
static java.io.Writer |
quote(java.lang.String string,
java.io.Writer w)
Writes a quoted (encoded) version of the string to the Writer, and
returns the same writer that was passed in.
|
static JSONObject |
readFileIfExists(java.io.File inFile)
Open the file if exists, read the contents, and return the
JSONObject tree that the file represents.
|
static JSONObject |
readFromFile(java.io.File inFile)
Open the file if exists, read the contents, and return the
JSONObject tree that the file represents.
|
java.lang.Object |
remove(java.lang.String key)
Remove a name and its value, if present.
|
JSONArray |
requireJSONArray(java.lang.String key)
Get the JSONArray value associated with a key
and create an empty array with that key if it does not yet exist.
|
JSONObject |
requireJSONObject(java.lang.String key)
Get the JSONObject value associated with a key, and create one
if it does not exist yet.
|
java.util.Iterator<java.lang.String> |
sortedKeys()
Deprecated.
use sortedKeySet instead because iterators are old fashioned
|
java.util.List<java.lang.String> |
sortedKeySet() |
static java.lang.Object |
stringToValue(java.lang.String string)
Try to convert a string into a number, boolean, or null.
|
static void |
testValidity(java.lang.Object o)
Throw an exception if the object is a NaN or infinite number.
|
JSONArray |
toJSONArray(JSONArray names)
Produce a JSONArray containing the values of the members of this
JSONObject.
|
java.lang.String |
toString()
Make a JSON text of this JSONObject.
|
java.lang.String |
toString(int indentFactor)
Make a JSON text String representation of this JSONObject.
|
static java.lang.String |
valueToString(java.lang.Object value)
Make a JSON text of an Object value.
|
static java.lang.Object |
wrap(java.lang.Object object)
Wrap an object, if necessary.
|
java.io.Writer |
write(java.io.Writer writer)
Write the contents of the JSONObject as JSON text.
|
java.io.Writer |
write(java.io.Writer writer,
int indentFactor,
int indent)
Write the contents of the JSONObject as JSON text to a writer.
|
void |
writeToFile(java.io.File outFile)
Write the entire contents of the JSONObject tree to the specified
file using JSON format.
|
public static final java.lang.Object NULL
NULL
object than to use Java's null
value.
JSONObject.NULL.equals(null)
returns true
.
JSONObject.NULL.toString()
returns "null"
.public JSONObject()
public JSONObject(JSONObject jo, java.lang.String[] names) throws java.lang.Exception
jo
- A JSONObject.names
- An array of strings.JSONException
JSONException
- If a value is a non-finite number or if a name is duplicated.java.lang.Exception
public JSONObject(JSONTokener x) throws JSONException
For a UTF-8 encoded stream, use:
new JSONObject( new JSONTokener( inputStream ) );
For a character based reader, including inputStreams of other encodings
wrapped in the appropriate InputStreamReader, use:
new JSONObject( new JSONTokener( reader ) );
x
- A JSONTokener object containing the source string.JSONException
- If there is a syntax error in the source string
or a duplicated key.public JSONObject(java.lang.Object bean)
"get"
or "is"
followed by an uppercase letter,
the method is invoked, and a key and the value returned from the getter method
are put into the new JSONObject.
The key is formed by removing the "get"
or "is"
prefix.
If the second remaining character is not upper case, then the first
character is converted to lower case.
For example, if an object has a method named "getName"
, and
if the result of calling object.getName()
is "Larry Fine"
,
then the JSONObject will contain "name": "Larry Fine"
.bean
- An object that has getter methods that should be used
to make a JSONObject.public JSONObject(java.lang.String source) throws JSONException
JSONException
public static JSONObject readFromFile(java.io.File inFile) throws java.lang.Exception
java.lang.Exception
public static JSONObject readFileIfExists(java.io.File inFile) throws java.lang.Exception
java.lang.Exception
public void writeToFile(java.io.File outFile) throws java.lang.Exception
outFile
- java.lang.Exception
public JSONObject accumulate(java.lang.String key, java.lang.Object value) throws JSONException
key
- A key string.value
- An object to be accumulated under the key.JSONException
- If the value is an invalid number
or if the key is null.public JSONObject append(java.lang.String key, java.lang.Object value) throws JSONException
key
- A key string.value
- An object to be accumulated under the key.JSONException
- If the key is null or if the current value
associated with the key is not a JSONArray.public static java.lang.String doubleToString(double d)
d
- A double.public java.lang.Object get(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key is not found.public boolean getBoolean(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the value is not a Boolean or the String "true" or "false".public double getDouble(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key is not found or
if the value is not a Number object and cannot be converted to a number.public int getInt(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key is not found or if the value cannot
be converted to an integer.public JSONArray getJSONArray(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key is not found or
if the value is not a JSONArray.public JSONArray requireJSONArray(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key exists but value is not a JSONArray.public JSONObject getJSONObject(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key is not found or
if the value is not a JSONObject.public JSONObject requireJSONObject(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key exists but is not a JSONObject.public long getLong(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if the key is not found or if the value cannot
be converted to a long.public static java.lang.String[] getNames(JSONObject jo)
public static java.lang.String[] getNames(java.lang.Object object)
public java.lang.String getString(java.lang.String key) throws JSONException
key
- A key string.JSONException
- if there is no string value for the key.public boolean has(java.lang.String key)
key
- A key string.public JSONObject increment(java.lang.String key) throws JSONException
key
- A key string.JSONException
- If there is already a property with this name
that is not an Integer, Long, Double, or Float.public boolean isNull(java.lang.String key)
key
- A key string.public java.util.Set<java.lang.String> keySet()
public java.util.List<java.lang.String> sortedKeySet()
public java.util.Iterator<java.lang.String> sortedKeys()
public java.util.Iterator<java.lang.String> keys()
public int length()
public JSONArray names()
public static java.lang.String numberToString(java.lang.Number number) throws JSONException
number
- A NumberJSONException
- If n is a non-finite number.public java.lang.Object opt(java.lang.String key)
key
- A key string.public boolean optBoolean(java.lang.String key)
key
- A key string.public boolean optBoolean(java.lang.String key, boolean defaultValue)
key
- A key string.defaultValue
- The default.public double optDouble(java.lang.String key)
key
- A string which is the key.public double optDouble(java.lang.String key, double defaultValue)
key
- A key string.defaultValue
- The default.public int optInt(java.lang.String key)
key
- A key string.public int optInt(java.lang.String key, int defaultValue)
key
- A key string.defaultValue
- The default.public JSONArray optJSONArray(java.lang.String key)
key
- A key string.public JSONObject optJSONObject(java.lang.String key)
key
- A key string.public long optLong(java.lang.String key)
key
- A key string.public long optLong(java.lang.String key, long defaultValue)
key
- A key string.defaultValue
- The default.public java.lang.String optString(java.lang.String key)
key
- A key string.public java.lang.String optString(java.lang.String key, java.lang.String defaultValue)
key
- A key string.defaultValue
- The default.public JSONObject put(java.lang.String key, boolean value) throws JSONException
key
- A key string.value
- A boolean which is the value.JSONException
- If the key is null.public JSONObject put(java.lang.String key, java.util.Collection<?> value) throws JSONException
key
- A key string.value
- A Collection value.JSONException
public JSONObject put(java.lang.String key, double value) throws JSONException
key
- A key string.value
- A double which is the value.JSONException
- If the key is null or if the number is invalid.public JSONObject put(java.lang.String key, int value) throws JSONException
key
- A key string.value
- An int which is the value.JSONException
- If the key is null.public JSONObject put(java.lang.String key, long value) throws JSONException
key
- A key string.value
- A long which is the value.JSONException
- If the key is null.public JSONObject put(java.lang.String key, java.util.Map<java.lang.String,?> value) throws JSONException
key
- A key string.value
- A Map value.JSONException
public JSONObject put(java.lang.String key, java.lang.Object value) throws JSONException
key
- A key string.value
- An object which is the value. It should be of one of these
types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
or the JSONObject.NULL object.JSONException
- If the value is non-finite number
or if the key is null.public JSONObject putOnce(java.lang.String key, java.lang.Object value) throws JSONException
key
- value
- JSONException
- if the key is a duplicatepublic JSONObject putOpt(java.lang.String key, java.lang.Object value) throws JSONException
key
- A key string.value
- An object which is the value. It should be of one of these
types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
or the JSONObject.NULL object.JSONException
- If the value is a non-finite number.public static java.lang.String quote(java.lang.String string)
quote
. This method uses that
stream-based quote method. Consider using that if you are simply going
to write the string out someplace.string
- the string value you want to be encoded.public static java.io.Writer quote(java.lang.String string, java.io.Writer w) throws java.io.IOException
java.io.IOException
public java.lang.Object remove(java.lang.String key)
key
- The name to be removed.public static java.lang.Object stringToValue(java.lang.String string)
string
- A String.public static void testValidity(java.lang.Object o) throws JSONException
o
- The object to test.JSONException
- If o is a non-finite number.public JSONArray toJSONArray(JSONArray names) throws JSONException
names
- A JSONArray containing a list of key strings. This
determines the sequence of the values in the result.JSONException
- If any of the values are non-finite numbers.public java.lang.String toString()
Think carefully before using this method! Do you really need
a String in memory? Since JSON is used as a data transport format
normally you are going to write the String out to some destination.
It is far more efficient to use the write
operation
on this object directly. Think about it: you have a tree of JSON
objects in memory. This method will make a copy of all that data
into a single string -- a second copy of the data in memory.
If all you are going to do is to write that string out to a file,
then use the write method to stream it directly to the file.
If you are going to send the data from a server to client browser,
the write directly to the output stream. This reduces memory usage.
Sometimes you really do need a String, so the method is provided,
but use it sparingly.
Warning: This method assumes that the data structure is acyclical.
toString
in class java.lang.Object
{
(left brace) and ending
with }
(right brace).public java.lang.String toString(int indentFactor)
write
operation
on this object directly. Think about it: you have a tree of JSON
objects in memory. This method will make a copy of all that data
into a single string -- a second copy of the data in memory.
If all you are going to do is to write that string out to a file,
then use the write method to stream it directly to the file.
If you are going to send the data from a server to client browser,
the write directly to the output stream. This reduces memory usage.
Sometimes you really do need a String, so the method is provided,
but use it sparingly.
The JSON is produced indented by an indentFactor amount specified. If you specify zero indent, the output will be all on a single line. The elements are alphabetized only if an indent is specified.
Warning: This method assumes that the data structure is acyclical. An exception will be thrown if you have a cycle.
indentFactor
- The number of spaces to add to each level of
indentation.{
(left brace) and ending
with }
(right brace).JSONException
- If the object contains an invalid number.public static java.lang.String valueToString(java.lang.Object value) throws JSONException
Warning: This method assumes that the data structure is acyclical.
value
- The value to be serialized.{
(left brace) and ending
with }
(right brace).JSONException
- If the value is or contains an invalid number.public static java.lang.Object wrap(java.lang.Object object)
object
- The object to wrappublic java.io.Writer write(java.io.Writer writer) throws JSONException
Warning: This method assumes that the data structure is acyclical.
JSONException
public java.io.Writer write(java.io.Writer writer, int indentFactor, int indent) throws JSONException
Standard usage: jobj.write( writer, 2, 0 );
Warning: This method will abort if the indent level exceeds 100 because that probably indicates that the JSON is linked in a loop.
writer
- where the output goes toindentFactor
- specify the number of spaces for each level of nesting.
A value of 2 will indent two spaces for each level of indent.indent
- should be set to zero for the root most level when you
start the writing of a JSON document. This method is called recursively
and this parameter indicates the level of recursion.JSONException