公布一个Bean和Json互转的Java代码生成器

因为我们的业务中很多地方使用JSON作为数据交换的格式,之前对比过Java 中各个JSON组件,使用JSONObject的方式效率最高,但是也是最麻烦的,因为要自己手动写Bean和Json数据的转换代码。为了偷懒,自己写 了一个生成转换代码的程序,虽然很简单,但是很实用。下面贴出核心的代码生成方法:

public class MethodCallBIZ {

    public static String getValue(Object obj, String name) throws Exception {

        PropertyDescriptor pd = new PropertyDescriptor(name, obj.getClass());
        Method rM = pd.getReadMethod();// 获得读方法

        Object ret = rM.invoke(obj);
        if (ret == null) {
            return null;
        }

        return ret.toString();
    }

    public static void setValue(Object obj, String name, String value)
            throws Exception {
        PropertyDescriptor pd = new PropertyDescriptor(name, obj.getClass());
        Method wM = pd.getWriteMethod();
        wM.invoke(obj, value);
    }

    public static String codeBean(Class clazz) {
        StringBuffer code = new StringBuffer();

        String clzName = clazz.getName();
        clzName = clzName.substring(clzName.lastIndexOf(".") + 1);
        for (Field f : clazz.getDeclaredFields()) {
            String name = f.getName();
            if (!name.matches("[a-z][^_]*")) {
                continue;
            }

            code.append("/r/nprivate static String n_" + name + " = /"" + name
                    + "/";");
        }

        code.append("/r/n/r/n/r/n");
        // toJsonObject
        code.append("/r/npublic static JSONObject toJsonObject(" + clzName
                + " obj) {");
        code.append("/r/n/ttry {");
        code.append("/r/n/t/tJSONObject jObj = new JSONObject();");
        for (Field f : clazz.getDeclaredFields()) {
            String name = f.getName();
            if (!name.matches("[a-z][^_]*")) {
                continue;
            }
            String type = f.getType().toString();
            type = type.substring(type.lastIndexOf(".") + 1);
            if ("Date".equals(type)) {
                code.append("/r/n/t/tjObj.put(n_" + name + ", obj.get"
                        + upperFirst(name) + "().getTime());");
            } else {
                code.append("/r/n/t/tjObj.put(n_" + name + ", obj.get"
                        + upperFirst(name) + "());");
            }
        }
        code.append("/r/n/t/treturn jObj;");
        code.append("/r/n/t} catch (Exception ex) {");
        code.append("/r/n/t}");
        code.append("/r/n/treturn null;");
        code.append("/r/n}");

        code.append("/r/n/r/n");
        // toJsonList
        code.append("/r/npublic static String toJsonList(List<" + clzName
                + "> list) {");
        code.append("/r/n/tJSONArray array = new JSONArray();");
        code.append("/r/n/tfor (" + clzName + " obj : list) {");
        code.append("/r/n/t/tarray.put(toJsonObject(obj));");
        code.append("/r/n/t}");
        code.append("/r/n/treturn array.toString();");
        code.append("/r/n}");

        code.append("/r/n/r/n");
        // toJson
        code.append("/r/npublic static String toJson(" + clzName + " obj) {");
        code.append("/r/n/tJSONObject jObj = toJsonObject(obj);");
        code.append("/r/n/tif (jObj != null) {");
        code.append("/r/n/t/treturn jObj.toString();");
        code.append("/r/n/t}");
        code.append("/r/n/treturn null;");
        code.append("/r/n}");

        code.append("/r/n/r/n");
        // fromJsonObject
        code.append("/r/npublic static " + clzName
                + " fromJsonObject(JSONObject jObj) {");
        code.append("/r/n/t" + clzName + " obj = null;");
        code.append("/r/n/ttry {");
        code.append("/r/n/t/tobj = new " + clzName + "();");
        for (Field f : clazz.getDeclaredFields()) {
            String name = f.getName();
            if (!name.matches("[a-z][^_]*")) {
                continue;
            }
            code.append("/r/n/t/tif (!jObj.isNull(n_" + name + ")) {");
            String type = f.getType().toString();
            type = type.substring(type.lastIndexOf(".") + 1);
            if ("Integer".equals(type)) {
                type = "Int";
            }
            if ("Date".equals(type)) {
                code.append("/r/n/t/t/tobj.set" + upperFirst(name)
                        + "(new Date(jObj.getLong(n_" + name + ")));");
            } else {
                code.append("/r/n/t/t/tobj.set" + upperFirst(name)
                        + "(jObj.get" + type + "(n_" + name + "));");
            }
            code.append("/r/n/t/t}");
        }
        code.append("/r/n/t} catch (Exception ex) {");
        code.append("/r/n/t}");
        code.append("/r/n/treturn obj;");
        code.append("/r/n}");

        code.append("/r/n/r/n");
        // fromJsonList
        code.append("/r/npublic static List<" + clzName
                + "> fromJsonList(String json) {");
        code.append("/r/n/tList<" + clzName + "> list = new ArrayList<"
                + clzName + ">();");
        code.append("/r/n/ttry {");
        code.append("/r/n/t/tJSONArray array = new JSONArray(json);");
        code.append("/r/n/t/tfor (int i = 0; i < array.length(); i++) {");
        code.append("/r/n/t/t/tJSONObject jObj = array.getJSONObject(i);");
        code.append("/r/n/t/t/tif (jObj != null) {");
        code.append("/r/n/t/t/t/tlist.add(fromJsonObject(jObj));");
        code.append("/r/n/t/t/t}");
        code.append("/r/n/t/t}");
        code.append("/r/n/t} catch (Exception ex) {");
        code.append("/r/n/t}");
        code.append("/r/n/treturn list;");
        code.append("/r/n}");

        code.append("/r/n/r/n");
        // fromJson
        code.append("/r/npublic static " + clzName + " fromJson(String json) {");
        code.append("/r/n/ttry {");
        code.append("/r/n/t/tJSONObject jObj = new JSONObject(json);");
        code.append("/r/n/t/treturn fromJsonObject(jObj);");
        code.append("/r/n/t} catch (Exception ex) {");
        code.append("/r/n/t}");
        code.append("/r/n/treturn null;");
        code.append("/r/n}");

        return code.toString();
    }

    private static String upperFirst(String name) {
        String first = name.substring(0, 1);
        String others = name.substring(1);

        return first.toUpperCase() + others;
    }

    public static String toJson(Object obj, String name) throws Exception {

        PropertyDescriptor pd = new PropertyDescriptor(name, obj.getClass());
        Method rM = pd.getReadMethod();// 获得读方法

        Object ret = rM.invoke(obj);
        if (ret == null) {
            return null;
        }

        return ret.toString();
    }
}

调用codeBean方法即可生成代码,生成出来的内容为代码片段,只要加入到Bean中,即可以调用相应方法进行Bean和Json互相转换了。

调用示例:

// 要添加序列化代码的类
UserAccount obj = new UserAccount();
System.out.println(MethodCallBIZ.codeBean(obj.getClass()));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值