private boolean appendToList(List<JSONObject> tx, StringBuffer buffer) { if (buffer.length() == 0) return true; switch (buffer.charAt(0)) { case '[': int closePos = 0; boolean inString = false; int inArray = 0; for (int i = 1; i < buffer.length() && closePos == 0; i++) { switch (buffer.charAt(i)) { case '"': if (buffer.charAt(i - 1) != '\\') inString = !inString; break; case ']': if (!inString) { if (inArray == 0) closePos = i; else inArray--; } break; case '[': if (!inString) inArray++; break; default: break; } } if (inArray != 0 || closePos == 0) return false; List<JSONObject> subList = new ArrayList<JSONObject>(5); StringBuffer subBuff = new StringBuffer(buffer.substring(1, closePos)); boolean finished = appendToList(subList, subBuff); if (finished) { buffer.delete(0, closePos + 1); tx.add(new JSONObject(subList)); return appendToList(tx, buffer); } else return false; case '"': int finishPos = 0; do { finishPos = buffer.indexOf("\"", finishPos + 1); } while (finishPos == -1 || buffer.charAt(finishPos - 1) == '\\'); if (finishPos == -1) return false; tx.add(new JSONObject(buffer.substring(1, finishPos))); buffer.delete(0, finishPos + 1); return appendToList(tx, buffer); case ',': case ' ': buffer.delete(0, 1); return appendToList(tx, buffer); default: String first = buffer.toString().split(",")[0].trim(); if (first.equals("true")) { tx.add(new JSONObject(true)); buffer.delete(0, 4); return appendToList(tx, buffer); } else if (first.equals("false")) { tx.add(new JSONObject(false)); buffer.delete(0, 5); return appendToList(tx, buffer); } else if (first.matches("^-?[0-9]*$")) { tx.add(new JSONObject(Integer.parseInt(first))); buffer.delete(0, first.length()); return appendToList(tx, buffer); } else fail(); } return false; }