多層嵌套的json數據

不少時候咱們見到的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
相關文章
相關標籤/搜索