/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.json; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.List; /** * A JSON Array. */ public class JsonArray implements JsonValue { public static JsonArray create() { return new JsonArray(); } public static JsonArray parse(Reader reader) throws IOException, JsonException { final JsonArray arr = new Tokenizer(reader).nextValue().asArray(); if (arr == null) { throw new JsonException("Object is not a JSON array."); } return arr; } static JsonArray parse(Tokenizer tokenizer) throws IOException, JsonException { final JsonArray array = new JsonArray(); int c = tokenizer.nextNonWhitespace(); assert c == '['; while (true) { c = tokenizer.nextNonWhitespace(); switch (c) { case ']': return array; default: tokenizer.back(c); array.add(tokenizer.nextValue()); final int d = tokenizer.nextNonWhitespace(); switch (d) { case ']': return array; case ',': break; default: throw new JsonException("Invalid array: expected , or ]"); } } } } private final List<JsonValue> values = new ArrayList<JsonValue>(); public JsonArray() { } public void add(boolean value) { add(JsonBoolean.create(value)); } public void add(double value) { add(JsonNumber.create(value)); } public void add(JsonValue value) { values.add(value); } public void add(long value) { add(JsonNumber.create(value)); } public void add(String value) { add(JsonString.create(value)); } public JsonArray asArray() { return this; } public JsonBoolean asBoolean() { return null; } public JsonNumber asNumber() { return null; } public JsonObject asObject() { return null; } public JsonString asString() { return null; } public JsonArray copyDeeply() { final JsonArray copy = new JsonArray(); for (JsonValue value : values) { copy.values.add(value == null ? null : value.copyDeeply()); } return copy; } public JsonValue get(int index) { final JsonValue value = values.get(index); return (value == null) ? JsonValue.NULL : value; } public int getLength() { return values.size(); } public boolean isArray() { return true; } public boolean isBoolean() { return false; } public boolean isNumber() { return false; } public boolean isObject() { return false; } public boolean isString() { return false; } public void write(Writer writer) throws IOException { writer.write('['); for (int i = 0, n = values.size(); i < n; ++i) { if (i != 0) { writer.write(','); } values.get(i).write(writer); } writer.write(']'); } }