package com.googlecode.mycontainer.commons.util;
import java.io.CharArrayReader;
import java.io.Reader;
import java.io.Writer;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
public class JsonUtil {
public static JsonElement parse(char[] content) {
if (content == null) {
return null;
}
return parse(new CharArrayReader(content));
}
public static JsonElement parse(Reader reader) {
if (reader == null) {
return null;
}
JsonParser parser = new JsonParser();
JsonElement ret = parser.parse(reader);
return ret;
}
public static JsonElement parse(String json) {
if (json == null) {
return null;
}
JsonParser parser = new JsonParser();
JsonElement ret = parser.parse(json);
return ret;
}
public static void format(JsonElement element, Writer writer) {
getBuilder().create().toJson(element, writer);
}
public static GsonBuilder getBuilder() {
return new GsonBuilder();
}
public static Object value(JsonElement value) {
return getJsonValue(value);
}
public static Object getJsonValue(JsonElement value) {
if (value == null || value.isJsonNull()) {
return null;
}
if (value.isJsonPrimitive()) {
JsonPrimitive primitive = (JsonPrimitive) value;
if (primitive.isBoolean()) {
return primitive.getAsBoolean();
}
if (primitive.isNumber()) {
return primitive.getAsNumber();
}
if (primitive.isString()) {
return primitive.getAsString();
}
}
if (value.isJsonArray()) {
JsonArray array = (JsonArray) value;
Iterator<JsonElement> it = array.iterator();
List<Object> ret = new ArrayList<Object>();
while (it.hasNext()) {
JsonElement child = it.next();
if (child.isJsonNull() || child.isJsonPrimitive()) {
Object v = getJsonValue(child);
ret.add(v);
}
}
return ret;
}
throw new RuntimeException("unsupported: " + value);
}
@SuppressWarnings("unchecked")
public static JsonElement createBasic(Object value) {
if (value == null) {
return new JsonNull();
}
if (value instanceof Boolean) {
return new JsonPrimitive(((Boolean) value));
}
if (value instanceof Number) {
return new JsonPrimitive((Number) value);
}
if (value instanceof String) {
return new JsonPrimitive((String) value);
}
if (value instanceof Iterable) {
Iterable<Object> it = (Iterable<Object>) value;
JsonArray ret = new JsonArray();
for (Object object : it) {
ret.add(createBasic(object));
}
return ret;
}
throw new UnsupportedOperationException("unsupported type: " + value);
}
public static String formatPrimitive(Object value) {
return createBasic(value).toString();
}
public static boolean check(JsonElement element) {
if (element == null || element.isJsonNull()) {
return false;
}
if (element.isJsonPrimitive()) {
JsonPrimitive primitive = element.getAsJsonPrimitive();
if (primitive.isBoolean() && !primitive.getAsBoolean()) {
return false;
}
if (primitive.isNumber()
&& primitive.getAsNumber().doubleValue() == 0) {
return false;
}
if (primitive.isString() && primitive.getAsString().length() == 0) {
return false;
}
}
return true;
}
public static JsonArray sub(JsonArray array, Integer o, Integer l) {
if (o == null) {
o = 0;
}
if (l == null) {
l = array.size() - o;
}
JsonArray ret = new JsonArray();
for (int i = 0; i < l; i++) {
int idx = o + i;
if (idx >= array.size()) {
return ret;
}
ret.add(array.get(idx));
}
return ret;
}
public static boolean f(Object obj) {
if (obj == null) {
return true;
}
if (obj instanceof JsonElement) {
JsonElement element = (JsonElement) obj;
if (element.isJsonNull()) {
return true;
}
if (element.isJsonPrimitive()) {
JsonPrimitive primitive = element.getAsJsonPrimitive();
if (primitive.isBoolean()) {
return !primitive.getAsBoolean();
}
if (primitive.isNumber()) {
return primitive.getAsBigDecimal().compareTo(
BigDecimal.ZERO) == 0;
}
if (primitive.isString()) {
return primitive.getAsString().length() == 0;
}
}
}
if (obj instanceof Boolean) {
return !(Boolean) obj;
}
if (obj instanceof Number) {
return ((Number) obj).doubleValue() == 0d;
}
if (obj instanceof String) {
return ((String) obj).length() == 0;
}
return false;
}
public static boolean t(Object element) {
return !f(element);
}
public static JsonObject create(Object... values) {
if (values.length % 2 != 0) {
throw new RuntimeException("invalid length");
}
JsonObject ret = new JsonObject();
for (int i = 0; i < values.length; i += 2) {
String name = (String) values[i];
Object value = values[i + 1];
if (value == null) {
value = new JsonNull();
}
if (!(value instanceof JsonElement)) {
value = JsonUtil.createBasic(value);
}
ret.add(name, (JsonElement) value);
}
return ret;
}
public static JsonObject map(Map<String, Object> map) {
JsonObject ret = new JsonObject();
Set<Entry<String, Object>> entries = map.entrySet();
for (Entry<String, Object> entry : entries) {
String key = entry.getKey();
Object v = entry.getValue();
if (v == null) {
v = new JsonNull();
}
if (!(v instanceof JsonElement)) {
v = JsonUtil.createBasic(v);
}
ret.add(key, (JsonElement) v);
}
return ret;
}
public static JsonArray barray2json(byte[] bytes) {
JsonArray ret = new JsonArray();
for (byte b : bytes) {
ret.add(new JsonPrimitive(b));
}
return ret;
}
}