根据json来生成打印java字段(属性),解析方法,类--1

    首先声明一点,这个是最初版本,所以以最简单的json为例,后面会慢慢丰富和完善。

    一.背景描述:


    1.在还没有创建类的时候,拿到接口返回的json字段,这个时候会手工把所有的字段拷贝出来创建为类的属性,但是良心话:这个没有技术含量,为什么要浪费时间在这里。
    2.解析json对象是后话,因解析之前也要根据创建的类的属性和json字段对应,然后又回到第一步了,所以先把字段抽离出来吧。
    3.github地址: JavaPrintFieldAndClassFromJson

    二.提取字段:


json描述如下,下面是只含有int和String的字段,先以此为例:

{
"is_yellow_year_vip": "0",
"ret": 0,
"figureurl_qq_1":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/40",
"figureurl_qq_2":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"nickname": "小罗",
"yellow_vip_level": "0",
"msg": "",
"figureurl_1":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/50",
"vip": "0",
"level": "0",
"figureurl_2":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"is_yellow_vip": "0",
"gender": "男",
"figureurl":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/30"
}

    要创建这样一个解析json的类首先要把is_yellow_year_vip,ret等等先拿出来,还有可能出现拼错,而根据json创建类也是常见的事,所以我第一步写了一个把这里的int和String提取出来的方法。
private void json_to_field(String jsonStr){
if(jsonStr.startsWith("{") && jsonStr.endsWith("}")){
jsonStr = jsonStr.substring(1, jsonStr.length() - 1);
}

String[] params = jsonStr.replace("\n", "").split(",");

for(String param : params){

String[] map = param.split(":");
String key = map[0];
String value = map[1].replace(" ", "");
//下面是区分intString的方式,可以使用其他条件来判断(建议),丰富更多类型的时候会替换成条件判断
try{
key = key.replace("\"", "");
Integer.parseInt(value);
System.out.println("public int " + key + ";");
}catch (Exception e){
System.out.println("public String " + key + ";");
}

}
}
运行测试json_to_field(jsonStr);这个jsonStr就是上面的json,运行后的结果如下:
public String is_yellow_year_vip;
public int ret;
public String figureurl_qq_1;
public String figureurl_qq_2;
public String nickname;
public String yellow_vip_level;
public String msg;
public String figureurl_1;
public String vip;
public String level;
public String figureurl_2;
public String is_yellow_vip;
public String gender;
public String figureurl;

当然,字段的权限可以自己调整,上面也采取了偷懒的方式判断int和String的条件,如果更多类型的判断需要条件判断而不是try...catch。

三.从json提取解析方法


如果使用了一些第三方网络库加解析json的库,下面的功能可能就不用看了,但是可以了解下,而且只增加了一个功能,就是生成了一个解析各个属性json的功能。方法如下:
private void json_to_parse(String jsonStr, String className){
    if(jsonStr.startsWith("{") && jsonStr.endsWith("}")){
        jsonStr = jsonStr.substring(1, jsonStr.length() - 1);
    }
    String[] params = jsonStr.replace("\n", "").split(",");
    ArrayList<String> jsonParses = new ArrayList<>();
    String classObj = "m" + className;
    String jsonObject = "jsonObject";

    for(String param : params){
        String[] map = param.split(":");
        String key = map[0];
        String value = map[1].replace(" ", "");
        try{
            key = key.replace("\"", "");
            Integer.parseInt(value);
            System.out.println("public int " + key + ";");

            value = jsonObject + ".getInt(\"" + key + "\");";
        }catch (Exception e){
            System.out.println("public String " + key + ";");
            value = jsonObject + ".getString(\"" + key + "\" );";

        }
        jsonParses.add(classObj + "." + key + " = " + value);
    }

    System.out.println("public static " + className + " parse(JSONObject " + jsonObject + ") {");
    System.out.println("\tif (null == " + jsonObject + ") {return null;}");
    System.out.println("\t" + className + " " + classObj + " = new " + className + "();");

    for(String jsonParam : jsonParses){
        System.out.println("\t" + jsonParam);
    }

    System.out.println("}");
}
我们看到,实际上只增加了不到10行代码,在抽离字段的时候将值的解析字符串添加到了list里面,然后在打印完属性之后,在后面的方法里面把解析属性值的字符串打印了处理,运行json_to_parse(jsonStr, "QQUser");“QQUser”是我们将要创建的类,运行结果如下:

public String is_yellow_year_vip;
public int ret;
public String figureurl_qq_1;
public String figureurl_qq_2;
public String nickname;
public String yellow_vip_level;
public String msg;
public String figureurl_1;
public String vip;
public String level;
public String figureurl_2;
public String is_yellow_vip;
public String gender;
public String figureurl;
public static QQUser parse(JSONObject jsonObject) {
if (null == jsonObject) {return null;}
QQUser mQQUser = new QQUser();
mQQUser.is_yellow_year_vip = jsonObject.getString("is_yellow_year_vip" );
mQQUser.ret = jsonObject.getInt("ret");
mQQUser.figureurl_qq_1 = jsonObject.getString("figureurl_qq_1" );
mQQUser.figureurl_qq_2 = jsonObject.getString("figureurl_qq_2" );
mQQUser.nickname = jsonObject.getString("nickname" );
mQQUser.yellow_vip_level = jsonObject.getString("yellow_vip_level" );
mQQUser.msg = jsonObject.getString("msg" );
mQQUser.figureurl_1 = jsonObject.getString("figureurl_1" );
mQQUser.vip = jsonObject.getString("vip" );
mQQUser.level = jsonObject.getString("level" );
mQQUser.figureurl_2 = jsonObject.getString("figureurl_2" );
mQQUser.is_yellow_vip = jsonObject.getString("is_yellow_vip" );
mQQUser.gender = jsonObject.getString("gender" );
mQQUser.figureurl = jsonObject.getString("figureurl" );
}

其实,做到以上的步骤时,会忍不住把它完善,因为只差一点就完成了一个类的生成工作,所以,还是一起完成吧。


四.把json抽取成一个类


    从第三步可以看出,只要增加以下类的命名工作就差不多完成了一个类的抽取,所以只是将 json_to_parse再次完善下就可以了,下面是 json_to_calss方法:
private void json_to_class(String jsonStr, String className){
    if(jsonStr.startsWith("{") && jsonStr.endsWith("}")){
        jsonStr = jsonStr.substring(1, jsonStr.length() - 1);
    }
    String[] params = jsonStr.replace("\n", "").split(",");
    ArrayList<String> jsonParses = new ArrayList<>();

    String classObj = "m" + className;
    String jsonString = "jsonString";
    String jsonObject = "jsonObject";
    //类名开始的结构
    println("public class " + className + " {");
    //属性抽离和打印
    for(String param : params){
        String[] map = param.split(":");
        String key = map[0];
        String value = map[1].replace(" ", "");
        try{
            key = key.replace("\"", "");
            Integer.parseInt(value);
            println_t(1, "public int " + key + ";");
            value = jsonObject + ".getInt(\"" + key + "\");";
        }catch (Exception e){
            println_t(1, "public String " + key + ";");
            value = jsonObject + ".getString(\"" + key + "\");";
        }
        //组合的解析json添加的list        jsonParses.add(classObj + "." + key + " = " + value);
    }
    //className parse(String jsonString)方法
    //使用方式:className obj = className.parse(jsonString),QQUser user = QQUser.parse(jsonString)
    println_t(1, "public static " + className + " parse(String " + jsonString + ") {");
    println_t(2, "try {");
    println_t(3, "JSONObject jsonObject = new JSONObject(" + jsonString + ");");
    println_t(3, className + " " + classObj + " = new " + className + "();");
    for(String jsonParam : jsonParses){
        println_t(3, jsonParam);
    }
    println_t(3, "return " + classObj + ";");
    println_t(2, "} catch (JSONException e) {");
    println_t(3, "//e.printStackTrace();");
    println_t(3, "return null;");
    println_t(2, "}");
    println_t(1, "}");
    println("}");
}

private void println(String str){
    System.out.println(str);
}

private void println_t(int tableNum, String str){
    String tstr = "";
    for(int i = 0; i < tableNum; i ++){
        tstr += "\t";
    }
    System.out.println(tstr + str);
}
    看到上面代码基本上没有什么技术含量了,基本上就是打印一些拼装信息。运行只需要调用:
    json_to_class(jsonString, "QQUser");
    jsonString是json的字符串,"QQUser"是要创建的类名,可以随便取,打印出的结果如下:

public class QQUser {
public String is_yellow_year_vip;
public int ret;
public String figureurl_qq_1;
public String figureurl_qq_2;
public String nickname;
public String yellow_vip_level;
public String msg;
public String figureurl_1;
public String vip;
public String level;
public String figureurl_2;
public String is_yellow_vip;
public String gender;
public String figureurl;
public static QQUser parse(String jsonString) {
try {
JSONObject jsonObject = new JSONObject(jsonString);
QQUser mQQUser = new QQUser();
mQQUser.is_yellow_year_vip = jsonObject.getString("is_yellow_year_vip");
mQQUser.ret = jsonObject.getInt("ret");
mQQUser.figureurl_qq_1 = jsonObject.getString("figureurl_qq_1");
mQQUser.figureurl_qq_2 = jsonObject.getString("figureurl_qq_2");
mQQUser.nickname = jsonObject.getString("nickname");
mQQUser.yellow_vip_level = jsonObject.getString("yellow_vip_level");
mQQUser.msg = jsonObject.getString("msg");
mQQUser.figureurl_1 = jsonObject.getString("figureurl_1");
mQQUser.vip = jsonObject.getString("vip");
mQQUser.level = jsonObject.getString("level");
mQQUser.figureurl_2 = jsonObject.getString("figureurl_2");
mQQUser.is_yellow_vip = jsonObject.getString("is_yellow_vip");
mQQUser.gender = jsonObject.getString("gender");
mQQUser.figureurl = jsonObject.getString("figureurl");
return mQQUser;
} catch (JSONException e) {
//e.printStackTrace();
return null;
}
}
}

我们看到上面基本上就是一个类的形式了,当然可能需要自己引入一些包,这些不说了,快捷键几秒钟的事情。使用起来也很方便,如下:
className obj = className.parse(jsonString);
如QQUser user = QQUser.parse(jsonString)

ok,从json中提取属性和解析相应字段值的工作就基本完成了,虽然这里只是解析int和String,但是拓展的话只需要把try...catch区分条件替换成相应的条件然后进行拼装处理,这个后面有时间的话,我会完善下。

总结:

1.如果只需要提取json的字段为属性则只需要:json_to_field(String jsonStr)
2.如果需要解析json的方法可以使用:json_to_parse(String jsonStr, String className)
3.如果把json直接生产一个类的话,可以使用json_to_class(String jsonStr, String className)
注:2和3如果在不依赖或没有网络解析的情况下可能比较灵活。

如果有什么疑问或有问题欢迎指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值