1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.json;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCopyright (c) 2002 JSON.org
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectPermission is hereby granted, free of charge, to any person obtaining a copy
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectof this software and associated documentation files (the "Software"), to deal
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectin the Software without restriction, including without limitation the rights
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcopies of the Software, and to permit persons to whom the Software is
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfurnished to do so, subject to the following conditions:
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe above copyright notice and this permission notice shall be included in all
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcopies or substantial portions of the Software.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe Software shall be used for Good, not Evil.
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSOFTWARE.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashMap;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Map;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// BEGIN android-note
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//   - fixed bad htm in javadoc comments -joeo
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// END android-note
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A JSONObject is an unordered collection of name/value pairs. Its
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * external form is a string wrapped in curly braces with colons between the
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * names and values, and commas between the values and names. The internal form
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is an object having <code>get</code> and <code>opt</code> methods for
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * accessing the values by name, and <code>put</code> methods for adding or
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * replacing values by name. The values can be any of these types:
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>Number</code>, <code>String</code>, or the <code>JSONObject.NULL</code>
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object. A JSONObject constructor can be used to convert an external form
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JSON text into an internal form whose values can be retrieved with the
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>get</code> and <code>opt</code> methods, or to convert values into a
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JSON text using the <code>put</code> and <code>toString</code> methods.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A <code>get</code> method returns a value if one can be found, and throws an
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception if one cannot be found. An <code>opt</code> method returns a
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * default value instead of throwing an exception, and so is useful for
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * obtaining optional values.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The generic <code>get()</code> and <code>opt()</code> methods return an
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object, which you can cast or query for type. There are also typed
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <code>get</code> and <code>opt</code> methods that do type checking and type
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * coersion for you.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The <code>put</code> methods adds values to an object. For example, <pre>
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     myString = new JSONObject().put("JSON", "Hello, World!").toString();</pre>
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * produces the string <code>{"JSON": "Hello, World"}</code>.
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The texts produced by the <code>toString</code> methods strictly conform to
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the JSON sysntax rules.
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The constructors are more forgiving in the texts they will accept:
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul>
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>An extra <code>,</code>&nbsp;<small>(comma)</small> may appear just
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     before the closing brace.</li>
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Strings may be quoted with <code>'</code>&nbsp;<small>(single
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     quote)</small>.</li>
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Strings do not need to be quoted at all if they do not begin with a quote
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     or single quote, and if they do not contain leading or trailing spaces,
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     and if they do not contain any of these characters:
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     and if they are not the reserved words <code>true</code>,
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     <code>false</code>, or <code>null</code>.</li>
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Keys can be followed by <code>=</code> or <code>=></code> as well as
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     by <code>:</code>.</li>
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Values can be followed by <code>;</code> <small>(semicolon)</small> as
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     well as by <code>,</code> <small>(comma)</small>.</li>
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     <code>0x-</code> <small>(hex)</small> prefix.</li>
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Comments written in the slashshlash, slashstar, and hash conventions
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     will be ignored.</li>
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul>
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @author JSON.org
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @version 2
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class JSONObject {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JSONObject.NULL is equivalent to the value that JavaScript calls null,
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * whilst Java's null is equivalent to the value that JavaScript calls
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * undefined.
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     private static final class Null {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * There is only intended to be a single instance of the NULL object,
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * so the clone method returns itself.
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return     NULL.
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected final Object clone() {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * A Null object is equal to the null value and to itself.
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param object    An object to test for nullness.
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return true if the object parameter is the JSONObject.NULL object
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  or null.
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return object == null || object == this;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Get the "null" string value.
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return The string "null".
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "null";
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The hash map where the JSONObject's properties are kept.
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private HashMap myHashMap;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It is sometimes more convenient and less ambiguous to have a
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>NULL</code> object than to use Java's <code>null</code> value.
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final Object NULL = new Null();
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct an empty JSONObject.
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject() {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.myHashMap = new HashMap();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct a JSONObject from a subset of another JSONObject.
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * An array of strings is used to identify the keys that should be copied.
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Missing keys are ignored.
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param jo A JSONObject.
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sa An array of strings.
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception JSONException If a value is a non-finite number.
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject(JSONObject jo, String[] sa) throws JSONException {
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this();
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < sa.length; i += 1) {
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            putOpt(sa[i], jo.opt(sa[i]));
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct a JSONObject from a JSONTokener.
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param x A JSONTokener object containing the source string.
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If there is a syntax error in the source string.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject(JSONTokener x) throws JSONException {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this();
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char c;
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String key;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (x.nextClean() != '{') {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw x.syntaxError("A JSONObject text must begin with '{'");
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (;;) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c = x.nextClean();
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (c) {
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case 0:
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw x.syntaxError("A JSONObject text must end with '}'");
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '}':
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            default:
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                x.back();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                key = x.nextValue().toString();
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /*
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * The key is followed by ':'. We will also tolerate '=' or '=>'.
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c = x.nextClean();
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (c == '=') {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (x.next() != '>') {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    x.back();
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (c != ':') {
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw x.syntaxError("Expected a ':' after a key");
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.myHashMap.put(key, x.nextValue());
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /*
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * Pairs are separated by ','. We will also tolerate ';'.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (x.nextClean()) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case ';':
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case ',':
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (x.nextClean() == '}') {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return;
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                x.back();
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '}':
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            default:
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw x.syntaxError("Expected a ',' or '}'");
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct a JSONObject from a Map.
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map A map object that can be used to initialize the contents of
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  the JSONObject.
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject(Map map) {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.myHashMap = new HashMap(map);
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct a JSONObject from a string.
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is the most commonly used JSONObject constructor.
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param string    A string beginning
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception JSONException If there is a syntax error in the source string.
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject(String string) throws JSONException {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this(new JSONTokener(string));
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Accumulate values under a key. It is similar to the put method except
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that if there is already an object stored under the key then a
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JSONArray is stored under the key to hold all of the accumulated values.
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If there is already a JSONArray, then the new value is appended to it.
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * In contrast, the put method replaces the previous value.
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value An object to be accumulated under the key.
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the value is an invalid number
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  or if the key is null.
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject accumulate(String key, Object value)
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws JSONException {
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        testValidity(value);
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = opt(key);
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o == null) {
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(key, value);
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (o instanceof JSONArray) {
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ((JSONArray)o).put(value);
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(key, new JSONArray().put(o).put(value));
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the value object associated with a key.
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The object associated with the key.
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException if the key is not found.
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object get(String key) throws JSONException {
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = opt(key);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o == null) {
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new JSONException("JSONObject[" + quote(key) +
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "] not found.");
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return o;
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the boolean value associated with a key.
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The truth.
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  if the value is not a Boolean or the String "true" or "false".
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean getBoolean(String key) throws JSONException {
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = get(key);
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o.equals(Boolean.FALSE) ||
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (o instanceof String &&
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ((String)o).equalsIgnoreCase("false"))) {
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (o.equals(Boolean.TRUE) ||
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (o instanceof String &&
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ((String)o).equalsIgnoreCase("true"))) {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new JSONException("JSONObject[" + quote(key) +
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "] is not a Boolean.");
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the double value associated with a key.
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The numeric value.
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException if the key is not found or
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  if the value is not a Number object and cannot be converted to a number.
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public double getDouble(String key) throws JSONException {
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = get(key);
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return o instanceof Number ?
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    ((Number)o).doubleValue() : Double.parseDouble((String)o);
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new JSONException("JSONObject[" + quote(key) +
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "] is not a number.");
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the int value associated with a key. If the number value is too
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * large for an int, it will be clipped.
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The integer value.
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException if the key is not found or if the value cannot
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     be converted to an integer.
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getInt(String key) throws JSONException {
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = get(key);
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return o instanceof Number ?
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ((Number)o).intValue() : (int)getDouble(key);
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the JSONArray value associated with a key.
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A JSONArray which is the value.
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException if the key is not found or
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  if the value is not a JSONArray.
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONArray getJSONArray(String key) throws JSONException {
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = get(key);
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o instanceof JSONArray) {
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (JSONArray)o;
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new JSONException("JSONObject[" + quote(key) +
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "] is not a JSONArray.");
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the JSONObject value associated with a key.
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A JSONObject which is the value.
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException if the key is not found or
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  if the value is not a JSONObject.
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject getJSONObject(String key) throws JSONException {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = get(key);
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o instanceof JSONObject) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (JSONObject)o;
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new JSONException("JSONObject[" + quote(key) +
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "] is not a JSONObject.");
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the long value associated with a key. If the number value is too
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * long for a long, it will be clipped.
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The long value.
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException if the key is not found or if the value cannot
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     be converted to a long.
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getLong(String key) throws JSONException {
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = get(key);
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return o instanceof Number ?
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ((Number)o).longValue() : (long)getDouble(key);
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the string associated with a key.
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A string which is the value.
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws   JSONException if the key is not found.
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getString(String key) throws JSONException {
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return get(key).toString();
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Determine if the JSONObject contains a specific key.
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      true if the key exists in the JSONObject.
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean has(String key) {
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this.myHashMap.containsKey(key);
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Determine if the value associated with the key is null or if there is
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  no value.
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      true if there is no value associated with the key or if
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  the value is the JSONObject.NULL object.
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isNull(String key) {
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return JSONObject.NULL.equals(opt(key));
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an enumeration of the keys of the JSONObject.
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return An iterator of the keys.
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Iterator keys() {
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this.myHashMap.keySet().iterator();
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get the number of keys stored in the JSONObject.
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The number of keys in the JSONObject.
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int length() {
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this.myHashMap.size();
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Produce a JSONArray containing the names of the elements of this
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JSONObject.
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return A JSONArray containing the key strings, or null if the JSONObject
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is empty.
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONArray names() {
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        JSONArray ja = new JSONArray();
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator  keys = keys();
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (keys.hasNext()) {
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ja.put(keys.next());
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ja.length() == 0 ? null : ja;
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Produce a string from a number.
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param  n A Number
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return A String.
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If n is a non-finite number.
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static public String numberToString(Number n)
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws JSONException {
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (n == null) {
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new JSONException("Null pointer");
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        testValidity(n);
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project// Shave off trailing zeros and decimal point, if possible.
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String s = n.toString();
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (s.endsWith("0")) {
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                s = s.substring(0, s.length() - 1);
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (s.endsWith(".")) {
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                s = s.substring(0, s.length() - 1);
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return s;
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional value associated with a key.
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value, or null if there is no value.
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object opt(String key) {
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return key == null ? null : this.myHashMap.get(key);
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional boolean associated with a key.
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It returns false if there is no such key, or if the value is not
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Boolean.TRUE or the String "true".
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The truth.
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean optBoolean(String key) {
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return optBoolean(key, false);
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional boolean associated with a key.
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It returns the defaultValue if there is no such key, or if it is not
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a Boolean or the String "true" or "false" (case insensitive).
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key              A key string.
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue     The default.
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      The truth.
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean optBoolean(String key, boolean defaultValue) {
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return getBoolean(key);
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return defaultValue;
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional double associated with a key,
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or NaN if there is no such key or if its value is not a number.
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the value is a string, an attempt will be made to evaluate it as
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a number.
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A string which is the key.
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value.
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public double optDouble(String key) {
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return optDouble(key, Double.NaN);
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional double associated with a key, or the
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * defaultValue if there is no such key or if its value is not a number.
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the value is a string, an attempt will be made to evaluate it as
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a number.
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue     The default.
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value.
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public double optDouble(String key, double defaultValue) {
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object o = opt(key);
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return o instanceof Number ? ((Number)o).doubleValue() :
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new Double((String)o).doubleValue();
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return defaultValue;
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional int value associated with a key,
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or zero if there is no such key or if the value is not a number.
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the value is a string, an attempt will be made to evaluate it as
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a number.
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value.
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int optInt(String key) {
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return optInt(key, 0);
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional int value associated with a key,
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or the default if there is no such key or if the value is not a number.
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the value is a string, an attempt will be made to evaluate it as
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a number.
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue     The default.
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value.
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int optInt(String key, int defaultValue) {
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return getInt(key);
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return defaultValue;
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional JSONArray associated with a key.
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It returns null if there is no such key, or if its value is not a
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JSONArray.
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A JSONArray which is the value.
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONArray optJSONArray(String key) {
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = opt(key);
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return o instanceof JSONArray ? (JSONArray)o : null;
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional JSONObject associated with a key.
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It returns null if there is no such key, or if its value is not a
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JSONObject.
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A JSONObject which is the value.
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject optJSONObject(String key) {
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = opt(key);
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return o instanceof JSONObject ? (JSONObject)o : null;
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional long value associated with a key,
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or zero if there is no such key or if the value is not a number.
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the value is a string, an attempt will be made to evaluate it as
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a number.
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value.
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long optLong(String key) {
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return optLong(key, 0);
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional long value associated with a key,
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or the default if there is no such key or if the value is not a number.
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the value is a string, an attempt will be made to evaluate it as
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a number.
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue     The default.
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      An object which is the value.
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long optLong(String key, long defaultValue) {
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return getLong(key);
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return defaultValue;
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional string associated with a key.
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It returns an empty string if there is no such key. If the value is not
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a string and is not null, then it is coverted to a string.
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A string which is the value.
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String optString(String key) {
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return optString(key, "");
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Get an optional string associated with a key.
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It returns the defaultValue if there is no such key.
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue     The default.
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return      A string which is the value.
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String optString(String key, String defaultValue) {
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object o = opt(key);
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return o != null ? o.toString() : defaultValue;
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put a key/boolean pair in the JSONObject.
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value A boolean which is the value.
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the key is null.
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject put(String key, boolean value) throws JSONException {
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        put(key, Boolean.valueOf(value));
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put a key/double pair in the JSONObject.
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value A double which is the value.
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the key is null or if the number is invalid.
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject put(String key, double value) throws JSONException {
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        put(key, new Double(value));
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put a key/int pair in the JSONObject.
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value An int which is the value.
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the key is null.
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject put(String key, int value) throws JSONException {
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        put(key, new Integer(value));
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put a key/long pair in the JSONObject.
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value A long which is the value.
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the key is null.
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject put(String key, long value) throws JSONException {
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        put(key, new Long(value));
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put a key/value pair in the JSONObject. If the value is null,
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * then the key will be removed from the JSONObject if it is present.
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value An object which is the value. It should be of one of these
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  or the JSONObject.NULL object.
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the value is non-finite number
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     or if the key is null.
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject put(String key, Object value)
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws JSONException {
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key == null) {
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new JSONException("Null key.");
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value != null) {
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            testValidity(value);
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.myHashMap.put(key, value);
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            remove(key);
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put a key/value pair in the JSONObject, but only if the
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * key and the value are both non-null.
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key   A key string.
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value An object which is the value. It should be of one of these
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  or the JSONObject.NULL object.
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this.
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the value is a non-finite number.
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONObject putOpt(String key, Object value) throws JSONException {
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (key != null && value != null) {
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(key, value);
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Produce a string in double quotes with backslash sequences in all the
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * right places. A backslash will be inserted within &lt;/, allowing JSON
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * text to be delivered in HTML. In JSON text, a string cannot contain a
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * control character or an unescaped quote or backslash.
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param string A String
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return  A String correctly formatted for insertion in a JSON text.
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String quote(String string) {
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (string == null || string.length() == 0) {
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "\"\"";
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char         b;
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char         c = 0;
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int          i;
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int          len = string.length();
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder sb = new StringBuilder(len + 4);
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String       t;
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append('"');
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (i = 0; i < len; i += 1) {
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            b = c;
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c = string.charAt(i);
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (c) {
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '\\':
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '"':
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append('\\');
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(c);
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '/':
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (b == '<') {
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append('\\');
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(c);
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '\b':
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append("\\b");
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '\t':
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append("\\t");
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '\n':
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append("\\n");
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '\f':
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append("\\f");
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case '\r':
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append("\\r");
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            default:
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (c < ' ') {
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    t = "000" + Integer.toHexString(c);
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append("\\u" + t.substring(t.length() - 4));
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(c);
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append('"');
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sb.toString();
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Remove a name and its value, if present.
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key The name to be removed.
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return The value that was associated with the name,
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or null if there was no value.
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object remove(String key) {
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this.myHashMap.remove(key);
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception if the object is an NaN or infinite number.
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param o The object to test.
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If o is a non-finite number.
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void testValidity(Object o) throws JSONException {
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o != null) {
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (o instanceof Double) {
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new JSONException(
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "JSON does not allow non-finite numbers");
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (o instanceof Float) {
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new JSONException(
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "JSON does not allow non-finite numbers.");
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Produce a JSONArray containing the values of the members of this
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * JSONObject.
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param names A JSONArray containing a list of key strings. This
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * determines the sequence of the values in the result.
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return A JSONArray of values.
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If any of the values are non-finite numbers.
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public JSONArray toJSONArray(JSONArray names) throws JSONException {
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (names == null || names.length() == 0) {
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        JSONArray ja = new JSONArray();
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < names.length(); i += 1) {
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ja.put(this.opt(names.getString(i)));
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ja;
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Make an JSON text of this JSONObject. For compactness, no whitespace
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is added. If this would not result in a syntactically correct JSON text,
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * then null will be returned instead.
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Warning: This method assumes that the data structure is acyclical.
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a printable, displayable, portable, transmittable
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  representation of the object, beginning
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Iterator     keys = keys();
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            StringBuilder sb = new StringBuilder("{");
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (keys.hasNext()) {
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (sb.length() > 1) {
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(',');
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object o = keys.next();
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(quote(o.toString()));
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(':');
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(valueToString(this.myHashMap.get(o)));
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append('}');
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sb.toString();
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Make a prettyprinted JSON text of this JSONObject.
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Warning: This method assumes that the data structure is acyclical.
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param indentFactor The number of spaces to add to each level of
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  indentation.
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a printable, displayable, portable, transmittable
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  representation of the object, beginning
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the object contains an invalid number.
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString(int indentFactor) throws JSONException {
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return toString(indentFactor, 0);
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Make a prettyprinted JSON text of this JSONObject.
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Warning: This method assumes that the data structure is acyclical.
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param indentFactor The number of spaces to add to each level of
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  indentation.
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param indent The indentation of the top level.
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a printable, displayable, transmittable
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  representation of the object, beginning
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the object contains an invalid number.
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    String toString(int indentFactor, int indent) throws JSONException {
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int          i;
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int          n = length();
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (n == 0) {
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "{}";
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator     keys = keys();
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder sb = new StringBuilder("{");
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int          newindent = indent + indentFactor;
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object       o;
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (n == 1) {
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            o = keys.next();
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(quote(o.toString()));
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(": ");
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(valueToString(this.myHashMap.get(o), indentFactor,
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    indent));
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (keys.hasNext()) {
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                o = keys.next();
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (sb.length() > 1) {
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(",\n");
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append('\n');
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (i = 0; i < newindent; i += 1) {
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(' ');
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(quote(o.toString()));
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(": ");
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(valueToString(this.myHashMap.get(o), indentFactor,
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        newindent));
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (sb.length() > 1) {
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append('\n');
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (i = 0; i < indent; i += 1) {
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sb.append(' ');
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append('}');
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sb.toString();
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Make a JSON text of an object value.
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Warning: This method assumes that the data structure is acyclical.
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value The value to be serialized.
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a printable, displayable, transmittable
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  representation of the object, beginning
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the value is or contains an invalid number.
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static String valueToString(Object value) throws JSONException {
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value == null || value.equals(null)) {
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "null";
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value instanceof Number) {
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return numberToString((Number) value);
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value instanceof Boolean || value instanceof JSONObject ||
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                value instanceof JSONArray) {
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return value.toString();
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return quote(value.toString());
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Make a prettyprinted JSON text of an object value.
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Warning: This method assumes that the data structure is acyclical.
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value The value to be serialized.
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param indentFactor The number of spaces to add to each level of
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  indentation.
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param indent The indentation of the top level.
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a printable, displayable, transmittable
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  representation of the object, beginning
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws JSONException If the object contains an invalid number.
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     static String valueToString(Object value, int indentFactor, int indent)
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             throws JSONException {
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value == null || value.equals(null)) {
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "null";
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value instanceof Number) {
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return numberToString((Number) value);
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value instanceof Boolean) {
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return value.toString();
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value instanceof JSONObject) {
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ((JSONObject)value).toString(indentFactor, indent);
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value instanceof JSONArray) {
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ((JSONArray)value).toString(indentFactor, indent);
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return quote(value.toString());
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
1082