很多时候我们见到的json数据都是多层嵌套的,就像下面这般:
{"name":"桔子桑", ?"sex":"男", ?"age":18,"grade":{"gname":"三年八班", ????????"gdesc":"初三年级八班" ????????} ?}
要获得以上类型json数据,不外乎以下步骤:
1.数据库查询
sql:select s.name,s.sex,s.age,g.gname,g.gdesc
from student s,grade g
where s.gid = g.gid; (你也可以选择用内连接的方法写)
这样我们就查询到了想要的信息,很显然,查询结果是一个Object[]的集合。
2.新建javaBean
其实开发工具会根据数据库多表之间的关系自动生成java实体类student,
但是,大多时候是部分字段查询,如果将查询结果直接转给现有的javaBean,
会出现未查询属性显示为0、[]的情况,所以我觉得有必要根据查询字段新建一个javaBean类,
针对上面的查询,新建以下两个javaBean:
//Ostudent类成员变量private String name;private String sex;private String age;private Ograde grade;//Ograde类成员变量private String gname;private String gdesc;
3.查询结果的转化
List<Object[]> listDB = query.list();List<Ostudent> listOut = new ArrayList();for (Object[] object : listDB) { ???????????String name = (String) object[0]; ???????????String sex = (String) object[1]; ???????????String age = (String) object[2]; ???????????String gname = (String) object[3]; ???????????String gdesc = (String) object[4]; ???????????Ograde gra = new Ograde(gname,gdesc); ???????????Ostudent stu = new Ostudent(name,sex,age,gra); ???????????listOut.add(stu);}
于是查询结果就转化成了n个Ostudent对象的集合。
4.响应数据
由于是Ostudent对象的集合,那么我们就可以用以下语句将其转为json字符串
JSONArray array = JSONArray.fromObject(objOut);String jsonstr = array.toString();response.getWriter().print(jsonstr);
这样就将查询结果以多层嵌套的json数据形式响应出去了。
5.前端调用
前端发起ajax请求成功之后,获得数据,我们在请求成功的回调函数里面可以这样写:
var json = $.parseJSON( data );$.each(json, function (index, item) { ??????????var name = json[index].name; ??????????var age = json[index].age; ???????var gname = json[index].grade.gname; ????});
是不是很简单?
6.后台调用
这里参考网上一个注释写得很全的,加以修改,然后记录下来
public static String getjson(String path, String parameter, String method) { ???????try { ???????????URL url = new URL(path); ???????????PrintWriter out = null; ???????????String line; ???????????StringBuilder sb = new StringBuilder(); ???????????// 打开和url之间的连接 ???????????HttpURLConnection conn = (HttpURLConnection) url.openConnection(); ???????????// 请求方式 ???????????conn.setRequestMethod(method); ???????????// //设置通用的请求属性 ???????????conn.setRequestProperty("accept", "*/*"); ???????????conn.setRequestProperty("connection", "Keep-Alive"); ???????????conn.setRequestProperty("user-agent", ???????????????????"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); ???????????// 设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个 ???????????// 最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet, ???????????// post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。 ???????????conn.setDoOutput(true); ???????????conn.setDoInput(true); ???????????// 获取URLConnection对象对应的输出流 ???????????out = new PrintWriter(conn.getOutputStream()); ???????????// 发送请求参数即数据 ???????????out.print(parameter); ???????????// 缓冲数据 ???????????out.flush(); ???????????// 获取URLConnection对象对应的输入流 ???????????InputStream is = conn.getInputStream(); ???????????// 构造一个字符流缓存 ???????????BufferedReader br = new BufferedReader(new InputStreamReader(is)); ???????????while ((line = br.readLine()) != null) { ???????????????sb.append(line); ???????????} ???????????// 关闭流 ???????????is.close(); ???????????// 断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。 ???????????// 固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。 ???????????conn.disconnect(); ???????????String str = sb.toString(); ???????????return str; ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????return "出错喽"; ???????} ???}
调用方法,获得json字符串,接下来就是将json字符串转化为java对象了
???????String jsonstr = getjson(path, param, method); ???????System.out.println(jsonstr); ???????JSONArray jsonArray = JSONArray.fromObject(jsonstr); ???????Object o = jsonArray.get(0); ???????JSONObject jsonObject = JSONObject.fromObject(o); ???????Student stu = (Student) JSONObject.toBean(jsonObject, Student.class); ???????System.out.println(stu.getGrade());
因为通常查询所得记录很多,所以json字符串会是多个对象的集合的形式(数组),
所以首先由json字符串--->转化为json数组--->获取数组项(对象)--->转化为json对象--->转化为对应的javaBean对象。
之后怎么获取成员变量的值就不多啰嗦了。
多层嵌套的json数据
原文地址:https://www.cnblogs.com/eco-just/p/8503673.html