JSON對象和簡單練習
前面一篇我們查找的圖書的name都是通過逗號隔開,然後拼接成一個字符串傳給瀏覽器。其實我們可以把多個圖書名稱用數組格式傳給瀏覽器,前端JS代碼通過遍歷這個數組,也是可以拿到這些name數據。現在,我們一般不用數組,而是用JSON這格式。本篇就來看看JSON是如何解決上一篇字符串傳給瀏覽器的代碼,以及JSON對象中常見的操作。
1環境搭建
在使用JSON對象之前,我們需要提前下載幾個jar包,拷貝到java web工程下的\WEB-INF\lib\路徑下
以下這幾個jar包可以到maven倉庫下載,我這裡也貼出來了這幾個下載地址。
commons-lang-xx.jar
commons-collections-3.2.2.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar
2把字符串改成JSON
上一篇我們在SearchBookAJAXServlet.java中是用字符串拼接,這次我們這裡改成JSON。
然後找打menu_search.jsp,更改下面紅圈這行代碼。
這個時候ss直接接收的就是一個數組對象,這裡是JSONArray對象。其中eval函數的作用就是讓後面這個數組對象作為一個完整表達式存在,不然會被切割亂七八糟。保存代碼之後,部署tomcat,然後重啟,瀏覽器訪問
在搜索框輸入一個j或者java,看看控制臺列印內容。
我這頁面查詢了兩次,所以輸出兩次。
所以,使用JSON對象一句話就搞定了,比前面字符串拼接簡單多了。下面,來看看JSON的常見幾個操作。
3 JSON對象常見操作
這裡,還是在這個圖書項目,新建一個json的包,然後新建一個JSONTest.java類
我們來寫一個測試用例,作用就是把JavaBean對象轉成JSON格式的Sting.
使用場景1:使用JSONObject對象封裝java中高級對象類型數據。
import org.junit.Test;
import com.anthony.domain.Book;
import net.sf.json.JSONObject;
public class JsonTest {
@Test
public void test1() {
Book b = new Book();
b.setId("12345");
b.setName("上下五千年");
b.setPrice(58);
String s = JSONObject.fromObject(b).toString();
System.out.println(s);
}
}
運行這個單元測試,輸出如下內容
{"category":"","description":"","id":"12345","name":"上下五千年","pnum":0,"price":58}
看看這個結果輸出,我們book只設置了三個屬性,沒有設置的分類和描述,默認是空字符串這個值,商品數量由於是int類型,默認就是0.
使用場景2:使用JSONArray封裝List集合數據
@Test
public void test2() {
List<Book> list = new ArrayList<Book>();
Book b1 = new Book();
b1.setId("1001");
b1.setName("西遊記");
b1.setPrice(58);
Book b2 = new Book();
b2.setId("1002");
b2.setName("三國演義");
b2.setPrice(68);
Book b3 = new Book();
b3.setId("1003");
b3.setName("水滸傳");
b3.setPrice(48);
list.add(b1);
list.add(b2);
list.add(b3);
String ss = JSONArray.fromObject(list).toString();
System.out.println(ss);
}
運行得到輸出:
[{"category":"","description":"","id":"1001","name":"西遊記","pnum":0,"price":58},{"category":"","description":"","id":"1002","name":"三國演義","pnum":0,"price":68},{"category":"","description":"","id":"1003","name":"水滸傳","pnum":0,"price":48}]
輸出是一個數組,裡面每一個元素都是一個JSON格式的對象。
使用場景3:使用JsonConfig對象過濾數據
有時候,我們JSON數據並不想要其中一些欄位,例如我們查詢圖書的結果,正常返回都是圖書的id,圖書name,圖書pnum,圖書price,圖書catogry,圖書description。
但是,有時候我們就只想要圖書name和圖書price返回,其他欄位不需要。這個時候就可以使用JsonConfig對象來過濾一些欄位。
@Test
public void test3() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
List<Book> list = qr.query("select * from book", new BeanListHandler<Book>(Book.class));
//過濾掉 圖書數量,描述和id,分類信息,只要價格和圖書名稱
JsonConfig jc = new JsonConfig();
// 過濾,不要這些欄位信息
jc.setExcludes(new String[] {"pnum", "id", "category", "description"});
String ss = JSONArray.fromObject(list, jc).toString();
System.out.println(ss);
}
運行得到:
[{"name":"Java編程思想","price":78.9},{"name":"python入門寶典","price":59},{"name":"JavaScript程序設計","price":69},{"name":"來自底層的奮鬥","price":39},{"name":"紅樓夢","price":59},{"name":"厚黑學","price":89},{"name":"西遊記","price":34.9},{"name":"Groovy程序設計","price":49.89}]
JSON對象的簡單使用就學習到這裡。