1. 程式人生 > >多層嵌套的json數據

多層嵌套的json數據

取數 query reader sel 類型 enc json字符串 發送post請求 red

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