blob: 7887bfd2a6654e04f0a5592178fdcd7a9aa75796 [file] [log] [blame]
/*
* 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(']');
}
}