17c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpackage com.google.polo.json;
27c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
37c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet/*
47c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetCopyright (c) 2002 JSON.org
57c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
67c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetPermission is hereby granted, free of charge, to any person obtaining a copy
77c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetof this software and associated documentation files (the "Software"), to deal
87c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetin the Software without restriction, including without limitation the rights
97c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetcopies of the Software, and to permit persons to whom the Software is
117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetfurnished to do so, subject to the following conditions:
127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
137c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetThe above copyright notice and this permission notice shall be included in all
147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetcopies or substantial portions of the Software.
157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
167c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetThe Software shall be used for Good, not Evil.
177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
187c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
197c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
207c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
217c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
227c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
237c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
247c9978567a202d6aa98beac5da5e1b3b34792862Jerome PoichetSOFTWARE.
257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet*/
267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.io.IOException;
287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.io.Writer;
297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.lang.reflect.Array;
307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.util.ArrayList;
317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.util.Collection;
327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.util.Iterator;
337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport java.util.Map;
347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet/**
367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * A JSONArray is an ordered sequence of values. Its external text form is a
377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * string wrapped in square brackets with commas separating the values. The
387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * internal form is an object having <code>get</code> and <code>opt</code>
397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * methods for accessing the values by index, and <code>put</code> methods for
407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * adding or replacing values. The values can be any of these types:
417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <code>Number</code>, <code>String</code>, or the
437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <code>JSONObject.NULL object</code>.
447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * The constructor can convert a JSON text into a Java object. The
467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <code>toString</code> method converts to JSON text.
477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * A <code>get</code> method returns a value if one can be found, and throws an
497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * exception if one cannot be found. An <code>opt</code> method returns a
507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * default value instead of throwing an exception, and so is useful for
517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * obtaining optional values.
527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * The generic <code>get()</code> and <code>opt()</code> methods return an
547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * object which you can cast or query for type. There are also typed
557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <code>get</code> and <code>opt</code> methods that do type checking and type
567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * coercion for you.
577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * The texts produced by the <code>toString</code> methods strictly conform to
597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * JSON syntax rules. The constructors are more forgiving in the texts they will
607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * accept:
617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <ul>
627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <li>An extra <code>,</code>&nbsp;<small>(comma)</small> may appear just
637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     before the closing bracket.</li>
647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <li>The <code>null</code> value will be inserted when there
657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     is <code>,</code>&nbsp;<small>(comma)</small> elision.</li>
667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <li>Strings may be quoted with <code>'</code>&nbsp;<small>(single
677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     quote)</small>.</li>
687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <li>Strings do not need to be quoted at all if they do not begin with a quote
697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     or single quote, and if they do not contain leading or trailing spaces,
707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     and if they do not contain any of these characters:
717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     and if they are not the reserved words <code>true</code>,
737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     <code>false</code>, or <code>null</code>.</li>
747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <li>Values can be separated by <code>;</code> <small>(semicolon)</small> as
757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     well as by <code>,</code> <small>(comma)</small>.</li>
767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet *     <code>0x-</code> <small>(hex)</small> prefix.</li>
787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * </ul>
797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * @author JSON.org
817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * @version 2009-04-13
827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet */
837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpublic class JSONArray {
847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The arrayList where the JSONArray's properties are kept.
887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private ArrayList myArrayList;
907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct an empty JSONArray.
947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray() {
967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this.myArrayList = new ArrayList();
977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct a JSONArray from a JSONTokener.
1017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param x A JSONTokener
1027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If there is a syntax error.
1037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray(JSONTokener x) throws JSONException {
1057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this();
1067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        char c = x.nextClean();
1077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        char q;
1087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (c == '[') {
1097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            q = ']';
1107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else if (c == '(') {
1117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            q = ')';
1127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else {
1137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throw x.syntaxError("A JSONArray text must start with '['");
1147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (x.nextClean() == ']') {
1167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return;
1177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        x.back();
1197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (;;) {
1207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (x.nextClean() == ',') {
1217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                x.back();
1227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                this.myArrayList.add(null);
1237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            } else {
1247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                x.back();
1257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                this.myArrayList.add(x.nextValue());
1267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
1277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            c = x.nextClean();
1287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            switch (c) {
1297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            case ';':
1307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            case ',':
1317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (x.nextClean() == ']') {
1327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    return;
1337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
1347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                x.back();
1357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                break;
1367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            case ']':
1377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            case ')':
1387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (q != c) {
1397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    throw x.syntaxError("Expected a '" + new Character(q) + "'");
1407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
1417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                return;
1427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            default:
1437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                throw x.syntaxError("Expected a ',' or ']'");
1447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
1457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct a JSONArray from a source JSON text.
1517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param source     A string that begins with
1527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * <code>[</code>&nbsp;<small>(left bracket)</small>
1537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  and ends with <code>]</code>&nbsp;<small>(right bracket)</small>.
1547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  @throws JSONException If there is a syntax error.
1557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray(String source) throws JSONException {
1577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this(new JSONTokener(source));
1587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct a JSONArray from a Collection.
1637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param collection     A Collection.
1647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray(Collection collection) {
1667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this.myArrayList = (collection == null) ?
1677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            new ArrayList() :
1687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            new ArrayList(collection);
1697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct a JSONArray from a collection of beans.
1737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The collection should have Java Beans.
1747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
1757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If not an array.
1767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray(Collection collection, boolean includeSuperClass) {
1797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet		this.myArrayList = new ArrayList();
1807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet		if (collection != null) {
1817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			Iterator iter = collection.iterator();;
1827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			while (iter.hasNext()) {
1837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			    Object o = iter.next();
1847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			    if (o instanceof Map) {
1857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			    	this.myArrayList.add(new JSONObject((Map)o, includeSuperClass));
1867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			    } else if (!JSONObject.isStandardProperty(o.getClass())) {
1877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			    	this.myArrayList.add(new JSONObject(o, includeSuperClass));
1887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			    } else {
1897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    this.myArrayList.add(o);
1907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet				}
1917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet			}
1927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet		}
1937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct a JSONArray from an array
1987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If not an array.
1997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray(Object array) throws JSONException {
2017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this();
2027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (array.getClass().isArray()) {
2037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            int length = Array.getLength(array);
2047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (int i = 0; i < length; i += 1) {
2057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                this.put(Array.get(array, i));
2067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
2077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else {
2087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throw new JSONException("JSONArray initial value should be a string or collection or array.");
2097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Construct a JSONArray from an array with a bean.
2147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The array should have Java Beans.
2157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
2167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If not an array.
2177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray(Object array,boolean includeSuperClass) throws JSONException {
2197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this();
2207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (array.getClass().isArray()) {
2217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            int length = Array.getLength(array);
2227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (int i = 0; i < length; i += 1) {
2237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                Object o = Array.get(array, i);
2247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (JSONObject.isStandardProperty(o.getClass())) {
2257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    this.myArrayList.add(o);
2267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                } else {
2277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    this.myArrayList.add(new JSONObject(o,includeSuperClass));
2287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
2297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
2307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else {
2317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throw new JSONException("JSONArray initial value should be a string or collection or array.");
2327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the object value associated with an index.
2397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index
2407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  The index must be between 0 and length() - 1.
2417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return An object value.
2427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If there is no value for the index.
2437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public Object get(int index) throws JSONException {
2457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = opt(index);
2467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (o == null) {
2477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throw new JSONException("JSONArray[" + index + "] not found.");
2487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o;
2507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the boolean value associated with an index.
2557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The string values "true" and "false" are converted to boolean.
2567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
2577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
2587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The truth.
2597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If there is no value for the index or if the
2607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  value is not convertable to boolean.
2617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public boolean getBoolean(int index) throws JSONException {
2637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = get(index);
2647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (o.equals(Boolean.FALSE) ||
2657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                (o instanceof String &&
2667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                ((String)o).equalsIgnoreCase("false"))) {
2677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return false;
2687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else if (o.equals(Boolean.TRUE) ||
2697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                (o instanceof String &&
2707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                ((String)o).equalsIgnoreCase("true"))) {
2717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return true;
2727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        throw new JSONException("JSONArray[" + index + "] is not a Boolean.");
2747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the double value associated with an index.
2797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
2807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
2817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
2827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws   JSONException If the key is not found or if the value cannot
2837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  be converted to a number.
2847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public double getDouble(int index) throws JSONException {
2867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = get(index);
2877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
2887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return o instanceof Number ?
2897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                ((Number)o).doubleValue() :
2907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                Double.valueOf((String)o).doubleValue();
2917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (Exception e) {
2927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throw new JSONException("JSONArray[" + index +
2937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                "] is not a number.");
2947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the int value associated with an index.
3007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
3017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
3027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
3037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws   JSONException If the key is not found or if the value cannot
3047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  be converted to a number.
3057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  if the value cannot be converted to a number.
3067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public int getInt(int index) throws JSONException {
3087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = get(index);
3097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o instanceof Number ?
3107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                ((Number)o).intValue() : (int)getDouble(index);
3117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
3127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
3157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the JSONArray associated with an index.
3167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
3177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A JSONArray value.
3187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If there is no value for the index. or if the
3197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * value is not a JSONArray
3207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray getJSONArray(int index) throws JSONException {
3227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = get(index);
3237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (o instanceof JSONArray) {
3247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return (JSONArray)o;
3257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
3267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        throw new JSONException("JSONArray[" + index +
3277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                "] is not a JSONArray.");
3287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
3297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
3327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the JSONObject associated with an index.
3337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index subscript
3347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A JSONObject value.
3357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If there is no value for the index or if the
3367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * value is not a JSONObject
3377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONObject getJSONObject(int index) throws JSONException {
3397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = get(index);
3407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (o instanceof JSONObject) {
3417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return (JSONObject)o;
3427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
3437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        throw new JSONException("JSONArray[" + index +
3447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            "] is not a JSONObject.");
3457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
3467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
3497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the long value associated with an index.
3507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
3517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
3527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
3537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws   JSONException If the key is not found or if the value cannot
3547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  be converted to a number.
3557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public long getLong(int index) throws JSONException {
3577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = get(index);
3587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o instanceof Number ?
3597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                ((Number)o).longValue() : (long)getDouble(index);
3607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
3617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
3647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the string associated with an index.
3657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
3667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A string value.
3677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If there is no value for the index.
3687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public String getString(int index) throws JSONException {
3707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return get(index).toString();
3717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
3727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
3757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Determine if the value is null.
3767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
3777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return true if the value at the index is null, or if there is no value.
3787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public boolean isNull(int index) {
3807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return JSONObject.NULL.equals(opt(index));
3817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
3827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
3857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Make a string from the contents of this JSONArray. The
3867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * <code>separator</code> string is inserted between each element.
3877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Warning: This method assumes that the data structure is acyclical.
3887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param separator A string that will be inserted between the elements.
3897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return a string.
3907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the array contains an invalid number.
3917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
3927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public String join(String separator) throws JSONException {
3937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        int len = length();
3947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        StringBuffer sb = new StringBuffer();
3957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
3967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = 0; i < len; i += 1) {
3977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (i > 0) {
3987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                sb.append(separator);
3997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
4007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
4017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
4027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return sb.toString();
4037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the number of elements in the JSONArray, included nulls.
4087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
4097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return The length (or size).
4107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public int length() {
4127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this.myArrayList.size();
4137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional object value associated with an index.
4187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
4197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      An object value, or null if there is no
4207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *              object at that index.
4217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public Object opt(int index) {
4237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return (index < 0 || index >= length()) ?
4247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            null : this.myArrayList.get(index);
4257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional boolean value associated with an index.
4307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * It returns false if there is no value at that index,
4317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not Boolean.TRUE or the String "true".
4327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
4337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
4347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The truth.
4357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public boolean optBoolean(int index)  {
4377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return optBoolean(index, false);
4387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional boolean value associated with an index.
4437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * It returns the defaultValue if there is no value at that index or if
4447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * it is not a Boolean or the String "true" or "false" (case insensitive).
4457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
4467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
4477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param defaultValue     A boolean default.
4487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The truth.
4497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public boolean optBoolean(int index, boolean defaultValue)  {
4517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
4527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return getBoolean(index);
4537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (Exception e) {
4547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return defaultValue;
4557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
4567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional double value associated with an index.
4617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * NaN is returned if there is no value for the index,
4627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a number and cannot be converted to a number.
4637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
4647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
4657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
4667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public double optDouble(int index) {
4687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return optDouble(index, Double.NaN);
4697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional double value associated with an index.
4747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The defaultValue is returned if there is no value for the index,
4757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a number and cannot be converted to a number.
4767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
4777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index subscript
4787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param defaultValue     The default value.
4797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
4807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public double optDouble(int index, double defaultValue) {
4827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
4837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return getDouble(index);
4847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (Exception e) {
4857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return defaultValue;
4867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
4877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
4887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
4907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
4917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional int value associated with an index.
4927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Zero is returned if there is no value for the index,
4937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a number and cannot be converted to a number.
4947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
4957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
4967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
4977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
4987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public int optInt(int index) {
4997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return optInt(index, 0);
5007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional int value associated with an index.
5057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The defaultValue is returned if there is no value for the index,
5067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a number and cannot be converted to a number.
5077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
5087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param defaultValue     The default value.
5097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
5107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public int optInt(int index, int defaultValue) {
5127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
5137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return getInt(index);
5147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (Exception e) {
5157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return defaultValue;
5167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
5177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional JSONArray associated with an index.
5227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index subscript
5237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A JSONArray value, or null if the index has no value,
5247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a JSONArray.
5257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray optJSONArray(int index) {
5277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = opt(index);
5287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o instanceof JSONArray ? (JSONArray)o : null;
5297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional JSONObject associated with an index.
5347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Null is returned if the key is not found, or null if the index has
5357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * no value, or if the value is not a JSONObject.
5367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
5377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
5387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A JSONObject value.
5397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONObject optJSONObject(int index) {
5417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = opt(index);
5427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o instanceof JSONObject ? (JSONObject)o : null;
5437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional long value associated with an index.
5487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Zero is returned if there is no value for the index,
5497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a number and cannot be converted to a number.
5507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
5517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
5527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
5537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public long optLong(int index) {
5557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return optLong(index, 0);
5567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional long value associated with an index.
5617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The defaultValue is returned if there is no value for the index,
5627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or if the value is not a number and cannot be converted to a number.
5637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
5647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param defaultValue     The default value.
5657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      The value.
5667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public long optLong(int index, long defaultValue) {
5687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
5697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return getLong(index);
5707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (Exception e) {
5717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return defaultValue;
5727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
5737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional string value associated with an index. It returns an
5787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * empty string if there is no value at that index. If the value
5797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * is not a string and is not null, then it is coverted to a string.
5807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
5817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
5827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A String value.
5837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public String optString(int index) {
5857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return optString(index, "");
5867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
5877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
5897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
5907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the optional string associated with an index.
5917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * The defaultValue is returned if the key is not found.
5927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
5937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index must be between 0 and length() - 1.
5947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param defaultValue     The default value.
5957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      A String value.
5967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
5977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public String optString(int index, String defaultValue) {
5987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Object o = opt(index);
5997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o != null ? o.toString() : defaultValue;
6007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Append a boolean value. This increases the array's length by one.
6057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
6067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A boolean value.
6077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
6087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(boolean value) {
6107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(value ? Boolean.TRUE : Boolean.FALSE);
6117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put a value in the JSONArray, where the value will be a
6177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * JSONArray which is produced from a Collection.
6187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A Collection value.
6197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      this.
6207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(Collection value) {
6227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(new JSONArray(value));
6237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Append a double value. This increases the array's length by one.
6297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
6307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A double value.
6317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException if the value is not finite.
6327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
6337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(double value) throws JSONException {
6357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        Double d = new Double(value);
6367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONObject.testValidity(d);
6377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(d);
6387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Append an int value. This increases the array's length by one.
6447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
6457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value An int value.
6467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
6477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int value) {
6497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(new Integer(value));
6507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Append an long value. This increases the array's length by one.
6567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
6577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A long value.
6587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
6597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(long value) {
6617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(new Long(value));
6627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put a value in the JSONArray, where the value will be a
6687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * JSONObject which is produced from a Map.
6697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A Map value.
6707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      this.
6717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(Map value) {
6737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(new JSONObject(value));
6747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Append an object value. This increases the array's length by one.
6807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value An object value.  The value should be a
6817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
6827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  JSONObject.NULL object.
6837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
6847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
6857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(Object value) {
6867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this.myArrayList.add(value);
6877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
6887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
6897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
6917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
6927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put or replace a boolean value in the JSONArray. If the index is greater
6937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * than the length of the JSONArray, then null elements will be added as
6947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * necessary to pad it out.
6957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
6967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A boolean value.
6977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
6987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative.
6997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, boolean value) throws JSONException {
7017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(index, value ? Boolean.TRUE : Boolean.FALSE);
7027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
7037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
7047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
7077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put a value in the JSONArray, where the value will be a
7087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * JSONArray which is produced from a Collection.
7097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
7107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A Collection value.
7117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      this.
7127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative or if the value is
7137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * not finite.
7147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, Collection value) throws JSONException {
7167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(index, new JSONArray(value));
7177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
7187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
7197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
7227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put or replace a double value. If the index is greater than the length of
7237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  the JSONArray, then null elements will be added as necessary to pad
7247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  it out.
7257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
7267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A double value.
7277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
7287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative or if the value is
7297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * not finite.
7307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, double value) throws JSONException {
7327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(index, new Double(value));
7337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
7347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
7357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
7387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put or replace an int value. If the index is greater than the length of
7397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  the JSONArray, then null elements will be added as necessary to pad
7407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  it out.
7417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
7427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value An int value.
7437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
7447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative.
7457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, int value) throws JSONException {
7477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(index, new Integer(value));
7487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
7497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
7507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
7537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put or replace a long value. If the index is greater than the length of
7547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  the JSONArray, then null elements will be added as necessary to pad
7557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  it out.
7567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
7577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value A long value.
7587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
7597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative.
7607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, long value) throws JSONException {
7627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(index, new Long(value));
7637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
7647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
7657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
7687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put a value in the JSONArray, where the value will be a
7697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * JSONObject which is produced from a Map.
7707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
7717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value The Map value.
7727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return      this.
7737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative or if the the value is
7747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  an invalid number.
7757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, Map value) throws JSONException {
7777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        put(index, new JSONObject(value));
7787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
7797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
7807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
7827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
7837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Put or replace an object value in the JSONArray. If the index is greater
7847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  than the length of the JSONArray, then null elements will be added as
7857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  necessary to pad it out.
7867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The subscript.
7877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param value The value to put into the array. The value should be a
7887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
7897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  JSONObject.NULL object.
7907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return this.
7917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If the index is negative or if the the value is
7927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  an invalid number.
7937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
7947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONArray put(int index, Object value) throws JSONException {
7957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONObject.testValidity(value);
7967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (index < 0) {
7977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throw new JSONException("JSONArray[" + index + "] not found.");
7987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
7997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (index < length()) {
8007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            this.myArrayList.set(index, value);
8017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else {
8027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            while (index != length()) {
8037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                put(JSONObject.NULL);
8047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
8057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            put(value);
8067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
8077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return this;
8087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
8097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
8127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Remove a index and close the hole.
8137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param index The index of the element to be removed.
8147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return The value that was associated with the index,
8157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * or null if there was no value.
8167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
8177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public Object remove(int index) {
8187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    	Object o = opt(index);
8197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        this.myArrayList.remove(index);
8207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return o;
8217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
8227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
8257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONObject by combining a JSONArray of names with the values
8267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * of this JSONArray.
8277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param names A JSONArray containing a list of key strings. These will be
8287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * paired with the values.
8297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONObject, or null if there are no names or if this JSONArray
8307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * has no values.
8317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException If any of the names are null.
8327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
8337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public JSONObject toJSONObject(JSONArray names) throws JSONException {
8347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (names == null || names.length() == 0 || length() == 0) {
8357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return null;
8367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
8377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONObject jo = new JSONObject();
8387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = 0; i < names.length(); i += 1) {
8397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            jo.put(names.getString(i), this.opt(i));
8407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
8417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return jo;
8427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
8437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
8467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Make a JSON text of this JSONArray. For compactness, no
8477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * unnecessary whitespace is added. If it is not possible to produce a
8487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * syntactically correct JSON text then null will be returned instead. This
8497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * could occur if the array contains an invalid number.
8507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * <p>
8517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Warning: This method assumes that the data structure is acyclical.
8527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
8537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return a printable, displayable, transmittable
8547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  representation of the array.
8557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
8567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public String toString() {
8577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
8587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return '[' + join(",") + ']';
8597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (Exception e) {
8607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return null;
8617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
8627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
8637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
8667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Make a prettyprinted JSON text of this JSONArray.
8677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Warning: This method assumes that the data structure is acyclical.
8687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param indentFactor The number of spaces to add to each level of
8697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  indentation.
8707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return a printable, displayable, transmittable
8717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  representation of the object, beginning
8727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  with <code>[</code>&nbsp;<small>(left bracket)</small> and ending
8737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  with <code>]</code>&nbsp;<small>(right bracket)</small>.
8747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
8757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
8767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public String toString(int indentFactor) throws JSONException {
8777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toString(indentFactor, 0);
8787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
8797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
8817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
8827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Make a prettyprinted JSON text of this JSONArray.
8837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Warning: This method assumes that the data structure is acyclical.
8847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param indentFactor The number of spaces to add to each level of
8857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  indentation.
8867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param indent The indention of the top level.
8877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return a printable, displayable, transmittable
8887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  representation of the array.
8897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
8907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
8917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    String toString(int indentFactor, int indent) throws JSONException {
8927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        int len = length();
8937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (len == 0) {
8947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return "[]";
8957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
8967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        int i;
8977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        StringBuffer sb = new StringBuffer("[");
8987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (len == 1) {
8997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            sb.append(JSONObject.valueToString(this.myArrayList.get(0),
9007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    indentFactor, indent));
9017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } else {
9027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            int newindent = indent + indentFactor;
9037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            sb.append('\n');
9047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (i = 0; i < len; i += 1) {
9057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (i > 0) {
9067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    sb.append(",\n");
9077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
9087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                for (int j = 0; j < newindent; j += 1) {
9097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    sb.append(' ');
9107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
9117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                sb.append(JSONObject.valueToString(this.myArrayList.get(i),
9127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        indentFactor, newindent));
9137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
9147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            sb.append('\n');
9157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (i = 0; i < indent; i += 1) {
9167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                sb.append(' ');
9177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
9187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
9197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        sb.append(']');
9207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return sb.toString();
9217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
9227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
9237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
9247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
9257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Write the contents of the JSONArray as JSON text to a writer.
9267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * For compactness, no whitespace is added.
9277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * <p>
9287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Warning: This method assumes that the data structure is acyclical.
9297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *
9307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return The writer.
9317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
9327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
9337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public Writer write(Writer writer) throws JSONException {
9347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        try {
9357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            boolean b = false;
9367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            int     len = length();
9377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
9387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            writer.write('[');
9397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
9407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (int i = 0; i < len; i += 1) {
9417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (b) {
9427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    writer.write(',');
9437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
9447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                Object v = this.myArrayList.get(i);
9457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (v instanceof JSONObject) {
9467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    ((JSONObject)v).write(writer);
9477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                } else if (v instanceof JSONArray) {
9487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    ((JSONArray)v).write(writer);
9497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                } else {
9507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    writer.write(JSONObject.valueToString(v));
9517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
9527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                b = true;
9537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
9547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            writer.write(']');
9557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return writer;
9567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } catch (IOException e) {
9577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet           throw new JSONException(e);
9587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
9597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
9607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet}