到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 {
@Test
public void testBeanO2JsonStr() {
String result = JsonUtil.bean2JsonStr(getUser());
System.out.println(result);
}
@Test
public void testJsonStr2Bean() {
Object obj = JsonUtil.jsonStr2Bean(JsonUtil.bean2JsonStr(getUser()),
User.class);
System.out.println(obj);
}
@Test
public void testJsonStr2List(){
List list = JsonUtil.jsonStr2List(getFromList().toString(), User.class);
System.out.println(list);
}
@Test
public void testJsonStr2Map(){
Map<?, ?> map = JsonUtil.jsonStr2Map(getFromMap().toString());
System.out.println(map);
}
@Test
public 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);
}
}