1)JSON簡介
2)JSON/LIST轉(zhuǎn)換
3)JSON/MAP轉(zhuǎn)換
4)JSON/動態(tài)Bean轉(zhuǎn)換
5)JSON/靜態(tài)Bean轉(zhuǎn)換
6)JSON/XML輸出
1.JSON簡介
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,基于JavaScript,但是不僅僅限于此。
詳情可以參考www.json.org
例如一段XML
<?xml version="1.0" encoding="utf-8"?>
<shop>
<name>飯店</name>
<city>北京</city>
</shop>
用JSON表示如下:
{
"name":"飯店",
"city":"北京"
}
XML的解析得考慮子節(jié)點父節(jié)點關(guān)系,而JSON的解析難度相當?shù)停芏嗫丶绕涫莂jax相關(guān)的數(shù)據(jù)交換很多都用json.
2)JSON/LIST轉(zhuǎn)換
本教程解析采用的json-lib,官方網(wǎng)站為http://json-lib.sourceforge.net/,本教程參考官方教程
環(huán)境需要配置的jar如下
commons-beanutils和ezmorph控制反射
commons-collections是apachecommons的子項目,擴展了java集合類
commons-lang擴展了java.lang包
commons-logging日志類
xom是xml解析類,可以參考www.xom.nu
junit單元測試用的jar
json-lib核心jar
項目文件夾中擁有貨物參數(shù)(Shop)和貨物參數(shù)列表(ShopList)兩個實體
Shop包含name和property兩個字段,ShopList包含Shop的列表
對應的json是
String s = "[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},{name:'顯卡類型',property:'p3'},{name:'硬盤容量',property:'p4'},{name:'處理器',property:'p5'},{name:'內(nèi)存',property:'p6'},{name:'型號',property:'p7'},{name:'貨號',property:'p8'},{name:'品牌',property:'p9'}]";
把這樣的數(shù)據(jù)結(jié)構(gòu)作為用戶定義個人信息存入數(shù)據(jù)庫可以達到個性化參數(shù)的作用,
比如shopex的數(shù)據(jù)庫中很多表就是用的json數(shù)據(jù)類型。因為用戶自己添加的參數(shù)的長度是不固定的
比如上述例子就擁有9個用戶自定義的參數(shù)
當用戶需要填寫這些參數(shù)的時候,需要轉(zhuǎn)化為list,然后在struts2的view去顯示
完成的代碼可以參考附件的ArrayUtil文件
核心代碼僅僅就一行JSONArray jsonArray = JSONArray.fromObject(s);
得到這個jsonArray后要轉(zhuǎn)化為ArrayList,需要用循環(huán)遍歷,如下
for (int i = 0; i < jsonArray.size(); i++) {
Object o = jsonArray.get(i);
JSONObject jsonObject = JSONObject.fromObject(o);
Shop Person = (Shop) JSONObject.toBean(jsonObject, Shop.class);
list.add(Person);
}
然后得到的list就是普通的ArrayList了
3)JSON/MAP轉(zhuǎn)換
當我們初始化完一個map,放入json可以直接放入
Map<String, String> map = new HashMap<String, String>();
map.put("name", "重量");
map.put("property", "p1");
JSONObject jsonObject = JSONObject.fromObject(map);
核心代碼為
JSONObject jsonObject = JSONObject.fromObject(map);
JsonLib會自動映射
完成例子見附件MapUtil.java
4)JSON/動態(tài)Bean轉(zhuǎn)換
所謂動態(tài)bean即是java運行的時候根據(jù)情況創(chuàng)建的,而不是程序員已經(jīng)好了的Bean
JsonLib會自動根據(jù)Json格式數(shù)據(jù)創(chuàng)建字段,然后創(chuàng)建一個包含這些字段的Object
本例子中采用JUNIT做單元測試驗證,見DynamicBean.java
String s = "{name:'重量',property:'p1'}";
JSONObject jsonObject = JSONObject.fromObject(s);
Object bean = JSONObject.toBean(jsonObject);
assertEquals(jsonObject.get("name"), PropertyUtils.getProperty(bean,"name"));
assertEquals(jsonObject.get("property"), PropertyUtils.getProperty(bean,"property"));
5)JSON/靜態(tài)Bean轉(zhuǎn)換(StaticBean.java)
JSONLIB在轉(zhuǎn)換的時候會自動查找關(guān)系,比如子類和父類
例如JSON數(shù)據(jù)源
String s = "{'shopList':[{name:'重量',property:'p1'},{name:'尺寸',property:'p2'},{name:'顯卡類型',property:'p3'},{name:'硬盤容量',property:'p4'},{name:'處理器',property:'p5'},{name:'內(nèi)存',property:'p6'},{name:'型號',property:'p7'},{name:'貨號',property:'p8'},{name:'品牌',property:'p9'}]}";
存入Map
map.put("shopList", Shop.class);
ShopList shopList = (ShopList) JSONObject.toBean(JSONObject.fromObject(s), ShopList.class, map);
JSONObject.toBean()方法的三個參數(shù)分別表示數(shù)據(jù)源對應的JSON對象,轉(zhuǎn)化后的對象ShopList和數(shù)據(jù)源map
然后這樣也可以取得ShopList
這種方法和動態(tài)轉(zhuǎn)換的區(qū)別在于,動態(tài)轉(zhuǎn)換僅僅只是轉(zhuǎn)為Object
而靜態(tài)轉(zhuǎn)換是轉(zhuǎn)換為已經(jīng)定義過的實體類,會自動映射(這點類似Ibatis)
6)JSON/XML輸出
如果自己用String的方法轉(zhuǎn)化為XML輸出要寫很多代碼,然后條用JSONLIB,核心代碼僅僅一步
String xmlObject = xmlSerializer.write(object);
比如
String s = "{name:'重量',property:'p1'}";
XMLSerializer xmlSerializer = new XMLSerializer();
JSONObject object = JSONObject.fromObject(s);
String xmlObject = xmlSerializer.write(object);
System.out.println(xmlObject);
輸出結(jié)果為
<?xml version="1.0" encoding="UTF-8"?>
<o>
<name type="string">重量</name>
<property type="string">p1</property>
</o>