多層嵌套的json數據
很多時候我們見到的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數據