最近小弟用到Json,學習了一下,還是蠻簡單的,廢話少說,直接上手,不過在開始之前需要做一些準備工作。
到Json的官網上http://json-lib.sourceforge.net/,下載jar包。在官網也可以看到,使用Json還需要其他的一些jar包,官網上是這樣列的:
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6
當然,我們也可以使用相對新一些版本的jar包,不過需要注意的是,commons-lang這個jar需要選擇2.6版本以下的(當然包括2.6了),因為版本到3.3.0.1以後,jar包中的包名都發生了變化,再使用的話,會報錯i,當然我也沒有深究到底是哪個jar包引起的(有知道的不妨留言給小弟我,在此感謝)。
Json轉java對象經常會用到兩個類net.sf.json.JSONObject和net.sf.json.JSONArray,通過類名就可以看出來,前者是是針對無序集合而言,後者是針對有序集合如List等而言。
簡單介紹以下方法,JSONObject JSONObject.fromObject( Object object )這個方法把java對象做為參數,返回一個JSONObject對象,這個對象就是符合json格式的字串;
JSONArray JSONArray.fromObject( Object object )接收一個集合。
先定義一個實體類:
package com.bao.json.demo;import java.util.ArrayList;package com.bao.json.domain;public class User {private int id;private String name;private boolean gender;private float price;public User() {super();}public User(int id, String name) {super();this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isGender() {return gender;}public void setGender(boolean gender) {this.gender = gender;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}}
以下是工具類:
package com.bao.common.util;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import net.sf.json.JSONArray;import net.sf.json.JSONObject;/** * @Description:Json工具類 * 有序集合以'['開始,以']'結束;其他以'{'開始,以'}'結束. * java對象轉字串可以使用JSONArray或JSONObject. * @author:bao * @date:Dec 24, 2011 * @see JSONArray */public class JsonUtil {/** * @Description:POJO轉Json字串 * @param obj * @return String */public static String bean2JsonStr(Object obj) {JSONObject jsonObj = JSONObject.fromObject(obj);return JsonUtil.toString(jsonObj);}/** * @Description:Json字串轉POJO對象 * @param jsonStr * @param pojo * @return Object */public static Object jsonStr2Bean(String jsonStr, Class<?> clazz) {Object obj;JSONObject jsonObject = JSONObject.fromObject(jsonStr);obj = JSONObject.toBean(jsonObject, clazz);return obj;}/** * @Description:Json字串轉Map<String, Object> * @param jsonStr * @return Map<String,Object> */public static Map<String, Object> jsonStr2Map(String jsonStr) {Map<String, Object> result = new HashMap<String, Object>();JSONObject jsonObj = JSONObject.fromObject(jsonStr);Iterator<?> keys = jsonObj.keys();String key;Object val;while (keys.hasNext()) {key = (String) keys.next();val = jsonObj.get(key);result.put(key, val);}return result;}/** * @Description:Json字串轉List,內部對象為Object,需要手動轉換為制定的物件類型 * @param jsonStr * @param pojo * @return List */public static List jsonStr2List(String jsonStr, Class clazz) {List result = new ArrayList();JSONArray jsonArray = JSONArray.fromObject(jsonStr);JSONObject jsonObj;Object pojoVal;for (int i = 0; i < jsonArray.size(); i++) {jsonObj = jsonArray.getJSONObject(i);pojoVal = JSONObject.toBean(jsonObj, clazz);result.add(pojoVal);}return result;}public static Object[] jsonStr2ObjectArray(String jsonStr) {JSONArray jsonArray = JSONArray.fromObject(jsonStr);Object[] result = new Object[jsonArray.size()];for (int i = 0; i < jsonArray.size(); i++) {result[i] = jsonArray.get(i);}return result;}/** * @Description:將Object轉化為String * @param obj 指定對象,預設值為"" * @return String */public static String toString(Object obj) {return toString(obj, "");}/** * @Description:將Object轉化為String * @param obj 指定對象 * @param defaultStr 為空白的預設字串 * @return String */public static String toString(Object obj, String defaultStr) {String result = defaultStr;if (obj != null) {result = obj.toString();}return result;}}
以下是通過junit4.7測試過的:
package com.bao.common.util;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import org.junit.Test;import com.bao.json.domain.User;public class JsonUtilTest {@Testpublic void testBeanO2JsonStr() {String result = JsonUtil.bean2JsonStr(getUser());System.out.println(result);}@Testpublic void testJsonStr2Bean() {Object obj = JsonUtil.jsonStr2Bean(JsonUtil.bean2JsonStr(getUser()),User.class);System.out.println(obj);}@Testpublic void testJsonStr2List(){List list = JsonUtil.jsonStr2List(getFromList().toString(), User.class);System.out.println(list);}@Testpublic void testJsonStr2Map(){Map<?, ?> map = JsonUtil.jsonStr2Map(getFromMap().toString());System.out.println(map);}@Testpublic void testJsonStr2ObjectArray(){Integer[] result = {1,2,3};Object[] objs = JsonUtil.jsonStr2ObjectArray(JSONArray.fromObject(result).toString());for(int i=0;i<objs.length;i++){System.out.println(objs[i]);}}private static User getUser() {User user = new User();user.setId(11);user.setName("test");user.setGender(true);user.setPrice(2.7f);return user;}private static List<User> getList() {User user = getUser();List<User> users = new ArrayList<User>();for (int i = 0; i < 10; i++) {users.add(user);}return users;}private static JSONArray getFromList() {List<User> users = getList();return JSONArray.fromObject(users);}public static JSONObject getFromMap() {Map<String, Object> map = new HashMap<String, Object>();map.put("ua", getUser());map.put("list", getList());return JSONObject.fromObject(map);}}