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 Poichet/**
287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * This provides static methods to convert comma delimited text into a
297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * JSONArray, and to covert a JSONArray into comma delimited text. Comma
307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * delimited text is a very popular format for data interchange. It is
317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * understood by most database, spreadsheet, and organizer programs.
327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Each row of text represents a row in a table or a data record. Each row
347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * ends with a NEWLINE character. Each row contains one or more values.
357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Values are separated by commas. A value can contain any character except
367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * for comma, unless is is wrapped in single quotes or double quotes.
377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * The first row usually contains the names of the columns.
397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * <p>
407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * A comma delimited list can be converted into a JSONArray of JSONObjects.
417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * The names for the elements in the JSONObjects can be taken from the names
427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * in the first row.
437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * @author JSON.org
447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * @version 2008-09-18
457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet */
467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpublic class CDL {
477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Get the next value. The value can be wrapped in quotes. The value can
507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * be empty.
517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param x A JSONTokener of the source text.
527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return The value string, or null if empty.
537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException if the quoted string is badly formed.
547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private static String getValue(JSONTokener x) throws JSONException {
567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        char c;
577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        do {
587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            c = x.next();
597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        } while (c == ' ' || c == '\t');
607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        switch (c) {
617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        case 0:
627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return null;
637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        case '"':
647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        case '\'':
657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return x.nextString(c);
667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        case ',':
677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            x.back();
687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return "";
697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        default:
707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            x.back();
717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return x.nextTo(',');
727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONArray of strings from a row of comma delimited values.
777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param x A JSONTokener of the source text.
787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONArray of strings.
797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static JSONArray rowToJSONArray(JSONTokener x) throws JSONException {
827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONArray ja = new JSONArray();
837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (;;) {
847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            String value = getValue(x);
857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (value == null || (ja.length() == 0 && value.length() == 0)) {
867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                return null;
877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            ja.put(value);
897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            for (;;) {
907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                char c = x.next();
917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (c == ',') {
927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    break;
937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (c != ' ') {
957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    if (c == '\n' || c == '\r' || c == 0) {
967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        return ja;
977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    }
987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    throw x.syntaxError("Bad character '" + c + "' (" +
997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                            (int)c + ").");
1007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
1017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
1027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONObject from a row of comma delimited text, using a
1077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * parallel JSONArray of strings to provides the names of the elements.
1087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param names A JSONArray of names. This is commonly obtained from the
1097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  first row of a comma delimited text file using the rowToJSONArray
1107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     *  method.
1117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param x A JSONTokener of the source text.
1127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONObject combining the names and values.
1137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
1147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x)
1167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throws JSONException {
1177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONArray ja = rowToJSONArray(x);
1187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return ja != null ? ja.toJSONObject(names) :  null;
1197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONArray of JSONObjects from a comma delimited text string,
1237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * using the first row as a source of names.
1247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param string The comma delimited text.
1257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONArray of JSONObjects.
1267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
1277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static JSONArray toJSONArray(String string) throws JSONException {
1297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toJSONArray(new JSONTokener(string));
1307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONArray of JSONObjects from a comma delimited text string,
1347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * using the first row as a source of names.
1357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param x The JSONTokener containing the comma delimited text.
1367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONArray of JSONObjects.
1377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
1387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static JSONArray toJSONArray(JSONTokener x) throws JSONException {
1407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toJSONArray(rowToJSONArray(x), x);
1417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONArray of JSONObjects from a comma delimited text string
1457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * using a supplied JSONArray as the source of element names.
1467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param names A JSONArray of strings.
1477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param string The comma delimited text.
1487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONArray of JSONObjects.
1497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
1507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static JSONArray toJSONArray(JSONArray names, String string)
1527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throws JSONException {
1537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return toJSONArray(names, new JSONTokener(string));
1547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a JSONArray of JSONObjects from a comma delimited text string
1587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * using a supplied JSONArray as the source of element names.
1597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param names A JSONArray of strings.
1607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param x A JSONTokener of the source text.
1617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A JSONArray of JSONObjects.
1627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
1637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static JSONArray toJSONArray(JSONArray names, JSONTokener x)
1657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throws JSONException {
1667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (names == null || names.length() == 0) {
1677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return null;
1687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONArray ja = new JSONArray();
1707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (;;) {
1717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            JSONObject jo = rowToJSONObject(names, x);
1727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (jo == null) {
1737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                break;
1747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
1757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            ja.put(jo);
1767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (ja.length() == 0) {
1787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return null;
1797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
1807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return ja;
1817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
1827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
1847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
1857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a comma delimited text row from a JSONArray. Values containing
1867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * the comma character will be quoted.
1877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param ja A JSONArray of strings.
1887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A string ending in NEWLINE.
1897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
1907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String rowToString(JSONArray ja) {
1917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        StringBuffer sb = new StringBuffer();
1927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = 0; i < ja.length(); i += 1) {
1937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (i > 0) {
1947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                sb.append(',');
1957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
1967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            Object o = ja.opt(i);
1977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (o != null) {
1987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                String s = o.toString();
1997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                if (s.indexOf(',') >= 0) {
2007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    if (s.indexOf('"') >= 0) {
2017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        sb.append('\'');
2027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        sb.append(s);
2037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        sb.append('\'');
2047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    } else {
2057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        sb.append('"');
2067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        sb.append(s);
2077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                        sb.append('"');
2087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    }
2097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                } else {
2107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                    sb.append(s);
2117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                }
2127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
2137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        sb.append('\n');
2157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return sb.toString();
2167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a comma delimited text from a JSONArray of JSONObjects. The
2217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * first row will be a list of names obtained by inspecting the first
2227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * JSONObject.
2237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param ja A JSONArray of JSONObjects.
2247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A comma delimited text.
2257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
2267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String toString(JSONArray ja) throws JSONException {
2287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        JSONObject jo = ja.optJSONObject(0);
2297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (jo != null) {
2307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            JSONArray names = jo.names();
2317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (names != null) {
2327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                return rowToString(names) + toString(names, ja);
2337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
2347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return null;
2367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
2387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
2397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Produce a comma delimited text from a JSONArray of JSONObjects using
2407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * a provided list of names. The list of names is not included in the
2417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * output.
2427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param names A JSONArray of strings.
2437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param ja A JSONArray of JSONObjects.
2447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @return A comma delimited text.
2457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @throws JSONException
2467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
2477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public static String toString(JSONArray names, JSONArray ja)
2487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            throws JSONException {
2497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        if (names == null || names.length() == 0) {
2507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            return null;
2517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        StringBuffer sb = new StringBuffer();
2537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        for (int i = 0; i < ja.length(); i += 1) {
2547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            JSONObject jo = ja.optJSONObject(i);
2557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            if (jo != null) {
2567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet                sb.append(rowToString(jo.toJSONArray(names)));
2577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet            }
2587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        }
2597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        return sb.toString();
2607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    }
2617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet}
262