您的位置:首页 > 编程语言 > Java开发

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

2017-02-17 15:56 459 查看
    首先声明一点,这个是最初版本,所以以最简单的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(" ", "");
//下面是区分int和String的方式,可以使用其他条件来判断(建议),丰富更多类型的时候会替换成条件判断
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如果在不依赖或没有网络解析的情况下可能比较灵活。

如果有什么疑问或有问题欢迎指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: