/*
*
*/
package org.smartly.commons.io.serialization.json;
import org.json.JSONArray;
import org.json.JSONObject;
import org.smartly.commons.io.serialization.json.utils.JsonBeanUtils;
import org.smartly.commons.util.BeanUtils;
import org.smartly.commons.util.StringUtils;
import org.smartly.commons.io.serialization.json.serializer.BeanSerializer;
import java.util.LinkedList;
import java.util.List;
/**
* Simple serializer/deserializer from java bean to json string and from
* json string to JSONObject (or Exception or List of JSONObject)
*
* @author angelo.geminiani
*/
public final class JsonBean {
private static final String TAG_VALUE = JsonBeanUtils.TAG_VALUE;
private static final String TAG_CLASS = JsonBeanUtils.TAG_CLASS;
private static final String TAG_TYPE = JsonBeanUtils.TAG_TYPE;
private static final String TAG_MESSAGE = JsonBeanUtils.TAG_MESSAGE;
private static final String TAG_CAUSE = JsonBeanUtils.TAG_CAUSE;
private static final String OBJECT = JsonBeanUtils.TYPE_OBJECT;
private static final String ERROR = JsonBeanUtils.TYPE_ERROR;
// internal object
private JSONObject _jsonobject;
public JsonBean(final Object object) {
_jsonobject = BeanSerializer.getInstance().serialize(object);
}
public JsonBean(final String jsontext) {
try {
_jsonobject = StringUtils.hasText(jsontext)
? new JSONObject(jsontext)
: new JSONObject();
} catch (Throwable t) {
_jsonobject = new JSONObject();
JsonBeanUtils.addError(_jsonobject, t);
}
}
@Override
public String toString() {
return _jsonobject.toString();
}
public String asString() {
return this.getTagValue();
}
/**
* Deserialize JSON string. Return:<br/>
* <ul>
* <li>Exception</li><br/>
* <li>JSONObject</li><br/>
* <li>List of JSONObject</li><br/>
* </ul>
*
* @return
*/
public Object asObject() {
try {
if (null != _jsonobject) {
if (this.isError()) {
return this.asException();
} else {
if (_jsonobject.has(TAG_VALUE)) {
final String object = this.getTagValue();
if (object.startsWith("{")) {
// object
return new JSONObject(object);
} else if (object.startsWith("[")) {
final LinkedList<Object> result = new LinkedList<Object>();
final JSONArray array = new JSONArray(object);
final int len = array.length();
for (int i = 0; i < len; i++) {
final Object val = array.opt(i);
if(val instanceof String || BeanUtils.PrimitiveClasses.isPrimitive(val.getClass())){
result.add("\"".concat(val.toString()).concat("\""));
} else{
result.add(val);
}
}
return result;
} else {
// native type
return object;
}
} else {
// does not contains tag object ( is native JSON )
return _jsonobject;
}
}
}
} catch (Throwable t) {
return t;
}
return null;
}
/**
* Returns JSONObjects List, JSONArray or JSONObject
* @return JSONObjects List, JSONArray or JSONObject
*/
public Object asJSONObject() {
final Object object = this.asObject();
if (object instanceof JSONObject) {
return (JSONObject) object;
} else if (object instanceof JSONArray) {
return (JSONArray) object;
} else if (object instanceof List) {
return (List) object;
} else if (object instanceof Exception) {
try {
final JSONObject json = new JSONObject();
json.putOnce("error", object.toString());
return json;
} catch (Throwable ignored) {
}
}
return null;
}
public Exception asException() {
if (isError()) {
final String cause = _jsonobject.optString(TAG_CAUSE, null);
final Exception result = StringUtils.hasText(cause)
? new Exception(this.getTagValue(), new Exception(cause))
: new Exception(this.getTagValue());
return result;
} else {
return null;
}
}
public int asInteger() {
if (JsonBeanUtils.isNative(this.getTagClass())) {
return Integer.parseInt(this.getTagValue());
}
return -1;
}
public double asDouble() {
if (JsonBeanUtils.isNative(this.getTagClass())) {
return Double.parseDouble(this.getTagValue());
}
return -1.0;
}
public long asLong() {
if (JsonBeanUtils.isNative(this.getTagClass())) {
return Long.parseLong(this.getTagValue());
}
return -1L;
}
public byte asByte() {
if (JsonBeanUtils.isNative(this.getTagClass())) {
return Byte.parseByte(this.getTagValue());
}
return 0;
}
public char asChar() {
if (JsonBeanUtils.isNative(this.getTagClass())) {
return this.getTagValue().charAt(0);
}
return 0;
}
public boolean asBoolean() {
if (JsonBeanUtils.isNative(this.getTagClass())) {
return Boolean.parseBoolean(this.getTagValue());
}
return false;
}
public boolean isError() {
if (null != _jsonobject) {
final String classType = _jsonobject.optString(TAG_TYPE, null);
if (null != classType) {
return classType.equals(ERROR);
}
}
return false;
}
public boolean isObject() {
if (null != _jsonobject) {
final String classType = _jsonobject.optString(TAG_TYPE, null);
if (null != classType) {
return classType.equals(OBJECT);
}
}
return false;
}
public boolean isNull() {
final String object = this.getTagValue();
return this.isObject() && !StringUtils.hasText(object);
}
public String getTagValue() {
if (null != _jsonobject) {
return _jsonobject.optString(TAG_VALUE, "");
}
return "";
}
public String getTagClass() {
if (null != _jsonobject) {
return _jsonobject.optString(TAG_CLASS, "");
}
return "";
}
public String getTagMessage() {
if (null != _jsonobject) {
return _jsonobject.optString(TAG_MESSAGE, "");
}
return "";
}
public String getTagCause() {
if (null != _jsonobject) {
return _jsonobject.optString(TAG_CAUSE, "");
}
return "";
}
public String getTagType() {
if (null != _jsonobject) {
return _jsonobject.optString(TAG_TYPE, "");
}
return "";
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
}