不少時候咱們見到的json數據都是多層嵌套的,就像下面這般:前端
{"name":"桔子桑", "sex":"男", "age":18, "grade":{"gname":"三年八班", "gdesc":"初三年級八班" } }
要得到以上類型json數據,不外乎如下步驟:java
1.數據庫查詢ajax
sql:select s.name,s.sex,s.age,g.gname,g.gdescsql
from student s,grade g數據庫
where s.gid = g.gid; (你也能夠選擇用內鏈接的方法寫)json
這樣咱們就查詢到了想要的信息,很顯然,查詢結果是一個Object[]的集合。數組
注意:因爲大多數人都是對sql語句很熟悉,而對於hql語句不太熟悉,因此用hibernate框架查詢的時候,緩存
有必要進行如下操做:session
String sql = "select s.sname,g.gname from student as s inner join grade as g on s.gid = g.gid WHERE s.sex = ? "; Query query = session.createSQLQuery(sql); query.setParameter(0, "男"); List<Object[]> listDB = query.list();
這樣就顯式地告訴hibernate執行sql查詢,而不是hql查詢,多線程
這兩種查詢仍是有區別的,有時候sql語句放到hql查詢裏面執行是會出現錯誤的。
2.新建javaBean
其實開發工具會根據數據庫多表之間的關係自動生成java實體類student,
可是,大多時候是部分字段查詢,若是將查詢結果直接轉給現有的javaBean,
就會出現下面相同的狀況,由於只查詢了sname和gname字段,
那麼沒查的字段在student實體類中則顯示爲空、0、[]
[ {"grade":{"gdesc":"","gid":0,"gname":"java","students":[]}, "sex":"", "sid":0,"sname":"桔子桑"}, {"grade":{"gdesc":"","gid":0,"gname":"java","students":[]}, "sex":"", "sid":0, "sname":"eco"}, {"grade":{"gdesc":"","gid":0,"gname":"java","students":[]}, "sex":"", "sid":0, "sname":"官方"} ]
因此我以爲有必要根據查詢字段新建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); //json字符串轉json數組 Object[] arr = jsonArray.toArray(); //json數組轉普通Object數組 for (Object o : arr) { //遍歷這個Object數組 JSONObject jsonObject = JSONObject.fromObject(o);//數組項(Object)轉json對象 Student stu = (Student) JSONObject .toBean(jsonObject, Student.class); //json對象轉javaBean對象 System.out.println(stu.getSname()); //訪問javaBean對象的成員變量 }
注意:遍歷的時候,這個o是不能直接強轉Student對象的,雖然Myeclipse不會在你寫代碼的時候報錯,
可是,運行的時候,會對這種強轉報如下錯誤:
net.sf.json.JSONObject cannot be cast to eco.aaa.Student