/**
* Copyright 2011 The nanojson Authors
*
* 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.grack.nanojson;
import java.util.Collection;
import java.util.Map;
import java.util.Stack;
/**
* Builds a {@link JsonObject} or {@link JsonArray}.
*
* @param <T>
* The type of JSON object to build.
*/
public final class JsonBuilder<T> implements JsonSink<JsonBuilder<T>> {
private Stack<Object> json = new Stack<Object>();
private T root;
JsonBuilder(T root) {
this.root = root;
json.push(root);
}
/**
* Completes this builder, closing any unclosed objects and returns the built object.
*/
public T done() {
return root;
}
@Override
public JsonBuilder<T> array(Collection<?> c) {
return value(c);
}
@Override
public JsonBuilder<T> array(String key, Collection<?> c) {
return value(key, c);
}
@Override
public JsonBuilder<T> object(Map<?, ?> map) {
return value(map);
}
@Override
public JsonBuilder<T> object(String key, Map<?, ?> map) {
return value(key, map);
}
@Override
public JsonBuilder<T> nul() {
return value((Object)null);
}
@Override
public JsonBuilder<T> nul(String key) {
return value(key, (Object)null);
}
@Override
public JsonBuilder<T> value(Object o) {
arr().add(o);
return this;
}
@Override
public JsonBuilder<T> value(String key, Object o) {
obj().put(key, o);
return this;
}
@Override
public JsonBuilder<T> value(String s) {
return value((Object)s);
}
@Override
public JsonBuilder<T> value(int i) {
return value((Object)i);
}
@Override
public JsonBuilder<T> value(long l) {
return value((Object)l);
}
@Override
public JsonBuilder<T> value(boolean b) {
return value((Object)b);
}
@Override
public JsonBuilder<T> value(double d) {
return value((Object)d);
}
@Override
public JsonBuilder<T> value(float f) {
return value((Object)f);
}
@Override
public JsonBuilder<T> value(Number n) {
return value((Object)n);
}
@Override
public JsonBuilder<T> value(String key, String s) {
return value(key, (Object)s);
}
@Override
public JsonBuilder<T> value(String key, int i) {
return value(key, (Object)i);
}
@Override
public JsonBuilder<T> value(String key, long l) {
return value(key, (Object)l);
}
@Override
public JsonBuilder<T> value(String key, boolean b) {
return value(key, (Object)b);
}
@Override
public JsonBuilder<T> value(String key, double d) {
return value(key, (Object)d);
}
@Override
public JsonBuilder<T> value(String key, float f) {
return value(key, (Object)f);
}
@Override
public JsonBuilder<T> value(String key, Number n) {
return value(key, (Object)n);
}
@Override
public JsonBuilder<T> array() {
JsonArray a = new JsonArray();
value(a);
json.push(a);
return this;
}
@Override
public JsonBuilder<T> object() {
JsonObject o = new JsonObject();
value(o);
json.push(o);
return this;
}
@Override
public JsonBuilder<T> array(String key) {
JsonArray a = new JsonArray();
value(key, a);
json.push(a);
return this;
}
@Override
public JsonBuilder<T> object(String key) {
JsonObject o = new JsonObject();
value(key, o);
json.push(o);
return this;
}
@Override
public JsonBuilder<T> end() {
if (json.size() == 1)
throw new JsonWriterException("Cannot end the root object or array");
json.pop();
return this;
}
private JsonObject obj() {
try {
return (JsonObject)json.peek();
} catch (ClassCastException e) {
throw new JsonWriterException("Attempted to write a keyed value to a JsonArray");
}
}
private JsonArray arr() {
try {
return (JsonArray)json.peek();
} catch (ClassCastException e) {
throw new JsonWriterException("Attempted to write a non-keyed value to a JsonObject");
}
}
}