多層嵌套的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[]的集合。

注意:由於大多數人都是對sql語句很熟悉,而對於hql語句不太熟悉,所以用hibernate框架查詢的時候,

有必要進行以下操作:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM