Package org.nutz.json.entity

Source Code of org.nutz.json.entity.JsonEntityField

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;
    }

}
TOP

Related Classes of org.nutz.json.entity.JsonEntityField

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.