package org.nutz.json.entity;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import org.nutz.json.JsonField;
import org.nutz.json.JsonIgnore;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
import org.nutz.lang.Strings;
import org.nutz.lang.eject.EjectByGetter;
import org.nutz.lang.eject.Ejecting;
import org.nutz.lang.inject.InjectBySetter;
import org.nutz.lang.inject.Injecting;
public class JsonEntityField {
private String name;
private boolean ignore;
private Type genericType;
private Injecting injecting;
private Ejecting ejecting;
private boolean forceString;
private double ignoreNullDouble = -0.94518;
private int ignoreNullInt = -94518;
private boolean isInt;
private boolean isDouble;
private boolean hasJsonIgnore;
public boolean isForceString() {
return forceString;
}
public void setForceString(boolean forceString) {
this.forceString = forceString;
}
public boolean isIgnore() {
return ignore;
}
public void setIgnore(boolean ignore) {
this.ignore = ignore;
}
/**
* 根据名称获取字段实体, 默认以set优先
*/
public static JsonEntityField eval(String name, Method getter, Method setter) {
JsonEntityField jef = new JsonEntityField();
jef.genericType = getter.getGenericReturnType();
jef.name = name;
jef.ejecting = new EjectByGetter(getter);
jef.injecting = new InjectBySetter(setter);
return jef;
}
public static JsonEntityField eval(Mirror<?> mirror, Field fld) {
if (fld == null) {
return null;
}
// 以特殊字符开头的字段,看起来是隐藏字段
// XXX 有用户就是_开头的字段也要啊! by wendal
// if (fld.getName().startsWith("_") || fld.getName().startsWith("$"))
if (fld.getName().startsWith("$")
&& fld.getAnnotation(JsonField.class) == null)
return null;
JsonField jf = fld.getAnnotation(JsonField.class);
JsonEntityField jef = new JsonEntityField();
jef.genericType = Lang.getFieldType(mirror, fld);
jef.name = Strings.sBlank(null == jf ? null : jf.value(), fld.getName());
jef.ejecting = mirror.getEjecting(fld.getName());
jef.injecting = mirror.getInjecting(fld.getName());
// 瞬时变量和明确声明忽略的,变 ignore
if (Modifier.isTransient(fld.getModifiers())
|| (null != jf && jf.ignore())) {
jef.setIgnore(true);
}
// 判断字段是否被强制输出为字符串
if (null != jf) {
jef.setForceString(jf.forceString());
}
JsonIgnore jsonIgnore = fld.getAnnotation(JsonIgnore.class);
if (jsonIgnore != null) {
Mirror<?> fldMirror = Mirror.me(fld.getType());
jef.isInt = fldMirror.isInt();
jef.isDouble = fldMirror.isDouble() || fldMirror.isFloat();
jef.hasJsonIgnore = true;
if (jef.isDouble)
jef.ignoreNullDouble = jsonIgnore.null_double();
if (jef.isInt)
jef.ignoreNullInt = jsonIgnore.null_int();
}
return jef;
}
private JsonEntityField() {}
public String getName() {
return name;
}
public Type getGenericType() {
return genericType;
}
public void setValue(Object obj, Object value) {
if (injecting != null)
injecting.inject(obj, value);
}
public Object getValue(Object obj) {
if (ejecting == null)
return null;
Object val = ejecting.eject(obj);
if (val == null)
return null;
if (hasJsonIgnore) {
if (isInt && ((Number)val).intValue() == ignoreNullInt)
return null;
if (isDouble && ((Number)val).doubleValue() == ignoreNullDouble)
return null;
}
return val;
}
}