package com.github.ltsopensource.json; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Array; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; import static com.github.ltsopensource.core.json.TypeUtils.*; /** * @author Robert HG (254963746@qq.com) on 12/28/15. */ public class JSONArray implements Iterable<Object> { private final ArrayList<Object> list; public JSONArray() { this.list = new ArrayList<Object>(); } public JSONArray(JSONTokenizer x) throws JSONException { this(); if (x.nextClean() != '[') { throw x.syntaxError("A JSONArray text must start with '['"); } if (x.nextClean() != ']') { x.back(); for (; ; ) { if (x.nextClean() == ',') { x.back(); this.list.add(JSONObject.NULL); } else { x.back(); this.list.add(x.nextValue()); } switch (x.nextClean()) { case ',': if (x.nextClean() == ']') { return; } x.back(); break; case ']': return; default: throw x.syntaxError("Expected a ',' or ']'"); } } } } public JSONArray(String source) throws JSONException { this(new JSONTokenizer(source)); } public JSONArray(Collection<?> collection) { this.list = new ArrayList<Object>(); if (collection != null) { for (Object o : collection) { this.list.add(JSONObject.wrap(o)); } } } public JSONArray(Object array) throws JSONException { this(); if (array.getClass().isArray()) { int length = Array.getLength(array); for (int i = 0; i < length; i += 1) { this.put(JSONObject.wrap(Array.get(array, i))); } } if (Collection.class.isAssignableFrom(array.getClass())) { Collection<?> collection = (Collection<?>) array; for (Object o : collection) { this.put(JSONObject.wrap(o)); } } else { throw new JSONException( "JSONArray initial value should be a string or collection or array."); } } public Iterator<Object> iterator() { return list.iterator(); } public Object get(int index) throws JSONException { return this.opt(index); } public Object opt(int index) { if (index < 0 || index >= this.length()) { return null; } Object value = list.get(index); if (value == JSONObject.NULL) { return null; } return value; } public JSONArray getJSONArray(int index) throws JSONException { Object object = this.get(index); if (object == null) { return null; } if (object instanceof JSONArray) { return (JSONArray) object; } throw new JSONException("JSONArray[" + index + "] is not a JSONArray."); } public JSONObject getJSONObject(int index) throws JSONException { Object object = this.get(index); if (object == null) { return null; } if (object instanceof JSONObject) { return (JSONObject) object; } throw new JSONException("JSONArray[" + index + "] is not a JSONObject."); } public int length() { return this.list.size(); } public JSONArray put(Object value) { this.list.add(value); return this; } public JSONArray put(int index, Object value) throws JSONException { if (index < 0) { throw new JSONException("JSONArray[" + index + "] not found."); } if (index < this.length()) { this.list.set(index, value); } else { while (index != this.length()) { this.put(JSONObject.NULL); } this.put(value); } return this; } public Object remove(int index) { return index >= 0 && index < this.length() ? this.list.remove(index) : null; } public boolean remove(Object o) { return list.remove(o); } public String toString() { try { return this.write(new StringWriter()).toString(); } catch (Exception e) { throw new JSONException(e); } } Writer write(Writer writer) throws JSONException { try { boolean commanate = false; int length = this.length(); writer.write('['); if (length == 1) { JSONObject.writeValue(writer, this.list.get(0)); } else if (length != 0) { for (int i = 0; i < length; i += 1) { if (commanate) { writer.write(','); } JSONObject.writeValue(writer, this.list.get(i)); commanate = true; } } writer.write(']'); return writer; } catch (IOException e) { throw new JSONException(e); } } public int size() { return list.size(); } public boolean isEmpty() { return list.isEmpty(); } public boolean contains(Object o) { return list.contains(o); } public Object[] toArray() { return list.toArray(); } public <T> T[] toArray(T[] a) { return list.toArray(a); } public boolean containsAll(Collection<?> c) { return list.containsAll(c); } public boolean addAll(Collection<?> c) { return list.addAll(c); } public boolean addAll(int index, Collection<?> c) { return list.addAll(index, c); } public boolean removeAll(Collection<?> c) { return list.removeAll(c); } public boolean retainAll(Collection<?> c) { return list.retainAll(c); } public void clear() { list.clear(); } public void add(int index, Object element) { list.add(index, element); } public int indexOf(Object o) { return list.indexOf(o); } public int lastIndexOf(Object o) { return list.lastIndexOf(o); } public ListIterator<Object> listIterator() { return list.listIterator(); } public ListIterator<Object> listIterator(int index) { return list.listIterator(index); } public List<Object> subList(int fromIndex, int toIndex) { return list.subList(fromIndex, toIndex); } public <T> T getObject(int index, Class<T> clazz) { Object value = list.get(index); return castToJavaBean(value, clazz); } public Boolean getBoolean(int index) { Object value = get(index); if (value == null) { return null; } return castToBoolean(value); } public boolean getBooleanValue(int index) { Object value = get(index); if (value == null) { return false; } return castToBoolean(value); } public Byte getByte(int index) { Object value = get(index); return castToByte(value); } public byte getByteValue(int index) { Object value = get(index); if (value == null) { return 0; } return castToByte(value); } public Short getShort(int index) { Object value = get(index); return castToShort(value); } public short getShortValue(int index) { Object value = get(index); if (value == null) { return 0; } return castToShort(value); } public Integer getInteger(int index) { Object value = get(index); return castToInt(value); } public int getIntValue(int index) { Object value = get(index); if (value == null) { return 0; } return castToInt(value); } public Long getLong(int index) { Object value = get(index); return castToLong(value); } public long getLongValue(int index) { Object value = get(index); if (value == null) { return 0L; } return castToLong(value); } public Float getFloat(int index) { Object value = get(index); return castToFloat(value); } public float getFloatValue(int index) { Object value = get(index); if (value == null) { return 0F; } return castToFloat(value); } public Double getDouble(int index) { Object value = get(index); return castToDouble(value); } public double getDoubleValue(int index) { Object value = get(index); if (value == null) { return 0D; } return castToDouble(value); } public BigDecimal getBigDecimal(int index) { Object value = get(index); return castToBigDecimal(value); } public BigInteger getBigInteger(int index) { Object value = get(index); return castToBigInteger(value); } public String getString(int index) { Object value = get(index); return castToString(value); } public java.util.Date getDate(int index) { Object value = get(index); return castToDate(value); } public java.sql.Date getSqlDate(int index) { Object value = get(index); return castToSqlDate(value); } public java.sql.Timestamp getTimestamp(int index) { Object value = get(index); return castToTimestamp(value); } }