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> <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> <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> <small>(left brace)</small> and ending 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with <code>}</code> <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 </, 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> <small>(left brace)</small> and ending 924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with <code>}</code> <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> <small>(left brace)</small> and ending 957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with <code>}</code> <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> <small>(left brace)</small> and ending 975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with <code>}</code> <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> <small>(left brace)</small> and ending 1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with <code>}</code> <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> <small>(left brace)</small> and ending 1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with <code>}</code> <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