首先声明一点,这个是最初版本,所以以最简单的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"
}
"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){运行测试json_to_field(jsonStr);这个jsonStr就是上面的json,运行后的结果如下:
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 + ";");
}
}
}
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的功能。方法如下:
我们看到,实际上只增加了不到10行代码,在抽离字段的时候将值的解析字符串添加到了list里面,然后在打印完属性之后,在后面的方法里面把解析属性值的字符串打印了处理,运行json_to_parse(jsonStr, "QQUser");“QQUser”是我们将要创建的类,运行结果如下: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("}"); }
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 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如果在不依赖或没有网络解析的情况下可能比较灵活。
如果有什么疑问或有问题欢迎指教。