通用JSON生成器3

接上文通用JSON生成器,上文给出了一个JSON生成器,用了一段时间,感觉还是有两个地方还不太爽。

  • 待生成的属性必须是public的,否则是获取不到该属性的值的。
  • 对时间如Date类型的不大友好,因为我们希望能够输出一种自己指定的Date数据格式

针对以上两点,我又重新写了一下:

  1. 首先,更改Output注解,添加一个pattern域,并设定一个默认值。
  2. 更改GenerateJSON中获取数据方式,之前由filed.get(obj)获取,但是如果filed不是public,那么会抛出异常。现在刚刚为使用get方法获取。
  3. 更改实体类为JavaBean方式,通过标准的get方法来获取域的值,而这个IDE都会自动生成的。

    代码:

---Out.java 注解文件----

package com.dacas.json.entity;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by dave on 2016/3/12.
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Output {
    public String value();
    public String pattern() default "yyyy-MM-dd";
}

-----GenerateJSON.java 生成JSON字符串主要类--------

package com.dacas.json.entity;
import org.json.JSONArray;
import org.json.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
 * Created by dave on 2016/3/6.
 */
public class GenerateJSON {
    public static <T> JSONObject getJSON(T t,Class<T> tClass) throws Exception{
        Field[] fileds = tClass.getDeclaredFields();//获取类的所有域,而getFileds()仅仅获取声明为public的域
        JSONObject jsonObject = new JSONObject();
        for (Field field:fileds){
            Output output = field.getAnnotation(Output.class);
            if(output != null){
                //查看filed的类型
                String name = output.value();//获取注解的值
                String getMethod = "get"+switchFirstUpper(field.getName());//生成获取对应域的get方法字符串
                Method method = tClass.getMethod(getMethod);//获取方法对象

                Object value = method.invoke(t);//method触发t的get方法
                if(value instanceof Date){//如果是日期类型,获取pattern参数,如果value为null的话,此处将返回false
                    String pattern = output.pattern();
                    SimpleDateFormat format = new SimpleDateFormat(pattern);
                    String dataVal = format.format(value);
                    jsonObject.put(name,dataVal);
                    continue;
                }
                jsonObject.put(name,value==null?"":value);//如果value==null,jsonObject将不会包含该key,而在get的时候,如果key不存在将抛出异常,个人觉得这是很不好的体验
            }
        }
        return jsonObject;
    }

    /**
     * 将字符串首字母大写
     * @param str
     * @return str
     */
    public static String switchFirstUpper(String str){
        char[] chars = str.toCharArray();
        chars[0] -= 32;
        return new String(chars);
    }

    public static <T> JSONArray getJSON(List<T> tlist,Class<T> tClass) throws Exception{
        JSONArray jsonArray = new JSONArray();
        for(T tmpT:tlist){
            jsonArray.put(getJSON(tmpT,tClass));
        }
        return jsonArray;
    }
    public static <T> String getJSONStr(T t,Class<T> tClass) throws Exception{
        JSONObject object = getJSON(t,tClass);
        return object.toString();
    }
    public static <T> String getJSONStr(List<T> tList,Class<T> tClass) throws Exception{
        JSONArray array = getJSON(tList,tClass);
        return array.toString();
    }
}

强烈建议大家将entity类中的所有域设置为对象,即使是包装对象,如Integer\Double等,因为这样如果对于null的情况也可以处理,否则将会抛出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值