1. 程式人生 > >JSON資料與Java物件相互轉換

JSON資料與Java物件相互轉換

整理下json資料與Java物件轉換。

使用的jar包:


ClassGrade類:

import java.util.ArrayList;
import java.util.List;
public class ClassGrade {
	private String className;
	private List<Student> students = new ArrayList<Student>();
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {
		this.className = className;
	}
	public List<Student> getStudents() {
		return students;
	}
	public void setStudents(List<Student> students) {
		this.students = students;
	}
	
}
Student類:
import java.util.Date;
public class Student {
	private String userName;
	private int age;
	private Date brith;
	
	public Student() {
		super();
	}
	public Student(String userName, int age, Date brith) {
		super();
		this.userName = userName;
		this.age = age;
		this.brith = brith;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getBrith() {
		return brith;
	}
	public void setBrith(Date brith) {
		this.brith = brith;
	}
	
}

DateProcessor類:處理Java物件中java.util.Date型別的屬性。

import java.text.SimpleDateFormat;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
/**
 * 轉化器
 * 將date型別轉換成json規範的字串
 * @author Administrator
 *
 */
public class DateProcessor implements JsonValueProcessor{
    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    public DateProcessor(String formatStr) {
    	if(formatStr != null) {
    		this.format = new SimpleDateFormat(formatStr);
    	}
    }
    @Override
    public Object processArrayValue(Object object, JsonConfig config) {
        return format.format(object);
    }

    @Override
    public Object processObjectValue(String str, Object object, JsonConfig config) {
        return format.format(object);
    }

}

一般情況下,日期轉化成json格式時,其格式比較複雜,比如一個生日:"brith":{"date":12,"day":2,"hours":11,"minutes":7,"month":0,"seconds":14,"time":1263265634870,"timezoneOffset":-480,"year":110},json會轉成這樣格式的,不是我們所熟悉的(yyyy-MM-dd等),使用DateProcessor可以轉換成我們自定義的格式。

MyJSONUtils:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.JSONUtils;

public class MyJSONUtils {
	/**
	 * 如果實體包含date型別資料,可以使用config處理
	 */
	private static JsonConfig config = new JsonConfig();
	static {
		DateProcessor processor = new DateProcessor("yyyy-MM-dd");
		config.registerJsonValueProcessor(Date.class, processor);
		initDateFormats();
	}

	/**
	 * JSON資料日期格式轉化成date型別的資料<br>
	 * 前面提到DateProcessor是將date型別轉成JSON格式資料<br>
	 * 一個是Java物件-->JSON格式資料<br>
	 * 一個是JSON格式資料-->Java物件
	 * 
	 * @author WF
	 * @since 2015-2-4 上午9:54:31
	 */
	private static void initDateFormats() {
		String[] dateFormats = new String[] { "yyyy/MM/dd HH:mm:ss",
				"yyyy/MM/dd HH:mm", "yyyy/MM/dd", "yyyyMMdd HH:mm:ss",
				"yyyyMMdd HH:mm", "yyyyMMdd", "yyyy-MM-dd HH:mm:ss",
				"yyyy-MM-dd HH:mm", "yyyy-MM-dd", "yyyy年MM月dd日 HH:mm:ss",
				"yyyy年MM月dd日 HH:mm", "yyyy年MM月dd日" };
		JSONUtils.getMorpherRegistry().registerMorpher(
				new DateMorpher(dateFormats));
	}

	/**
	 * 單個實體轉化成JSON資料
	 * 
	 * @author WF
	 * @since 2015-2-4 上午9:25:29
	 * @param object
	 * @return
	 */
	public static String OneBeanToJSON(Object object) {
		JSONObject jsonObject = JSONObject.fromObject(object, config);
		return jsonObject.toString();
	}

	/**
	 * 陣列或者集合轉化成JSON資料
	 * 
	 * @author WF
	 * @since 2015-2-4 上午9:25:51
	 * @param object
	 * @return
	 */
	public static String ListToJSON(Object object) {
		JSONArray jsonArray = JSONArray.fromObject(object, config);
		return jsonArray.toString();
	}

	/**
	 * JSON資料轉化成單個實體
	 * 
	 * @author WF
	 * @since 2015-2-4 上午11:16:45
	 * @param jsonStr
	 * @param clz
	 *            返回的Java物件的Class
	 * @param classMap
	 *            返回的Java物件可能包含其他物件,比如說ClassGrade類中有List<Student> students,
	 *            需要把Student類的Class塞到classMap裡面,
	 *            key為ClassGrade的屬性名(students),下同
	 * @return
	 */
	public static <T> Object JSONToOneBean(String jsonStr, Class<T> clz,
			Map<String, Class<?>> classMap) {
		JSONObject jsonObject = JSONObject.fromObject(jsonStr);
		Object object = JSONObject.toBean(jsonObject, clz, classMap);
		return object;
	}

	/**
	 * JSON資料轉化成List集合
	 * 
	 * @author WF
	 * @since 2015-2-4 上午10:24:55
	 * @param jsonStr
	 * @param clz
	 * @param classMap
	 * @return
	 */
	public static <T> List<T> JSONToList(String jsonStr, Class<T> clz,
			Map<String, Class<?>> classMap) {
		List<T> results = new ArrayList<T>();
		T[] ts = JSONToArray(jsonStr, clz, classMap);
		if (ts != null) {
			for (T t : ts) {
				results.add(t);
			}
		}
		return results;
	}

	/**
	 * JSON資料轉化成陣列集合
	 * 
	 * @author WF
	 * @since 2015-2-4 上午10:25:23
	 * @param jsonStr
	 * @param clz
	 * @param classMap
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T[] JSONToArray(String jsonStr, Class<T> clz,
			Map<String, Class<?>> classMap) {
		JSONArray jsonArray = JSONArray.fromObject(jsonStr);
		T[] ts = null;
		try {
			Object object = JSONArray.toArray(jsonArray, clz, classMap);
			ts = (T[]) object;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ts;
	}
}

下面給出一個Map與JSON相互轉化的例子:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
	public static void main(String[] args) {
		List<ClassGrade> grades = new ArrayList<ClassGrade>();
		ClassGrade grade = new ClassGrade();
		ClassGrade grade2 = new ClassGrade();
		List<Student> students = new ArrayList<Student>();
		for (int i = 0; i < 2; i++) {
			Student user = new Student("admin" + i, i, DateUtils.createDate(2010, i+1, 12+i));
			students.add(user);
		}
		grade.setClassName("一班");
		grade.setStudents(students);
		grade2.setClassName("二班");
		grade2.setStudents(students);
		grades.add(grade);
		grades.add(grade2);
		ClassGrade[] gradesArrs = new ClassGrade[2];
		gradesArrs[0] = new ClassGrade();
		gradesArrs[0].setClassName("一班");
		gradesArrs[0].setStudents(students);
		gradesArrs[1] = new ClassGrade();
		gradesArrs[1].setClassName("二班");
		gradesArrs[1].setStudents(students);
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("grade", grade);
		map.put("grades", grades);
		map.put("student", students.get(0));
		map.put("students", students);
		String jsonStr = MyJSONUtils.OneBeanToJSON(map);
		System.out.println("Map-->JSON:" + jsonStr);
		Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
		classMap.put("grade", ClassGrade.class);
		classMap.put("grades", ClassGrade.class);
		classMap.put("student", Student.class);
		classMap.put("students", Student.class);
		Map<String, Object> resultMap = (Map<String, Object>) MyJSONUtils.JSONToOneBean(jsonStr, Map.class, classMap);
		System.out.println("========================================================");
		
		ClassGrade grade3 = (ClassGrade) resultMap.get("grade");
		System.out.println("班級:" + grade3.getClassName());
		List<Student> list = grade3.getStudents();
		for (Student student : list) {
			System.out.println(student.getUserName() + ":" + format(student.getBrith()));
		}
		
		System.out.println("========================================================");
		List<ClassGrade> gradesResult = (List<ClassGrade>) resultMap.get("grades");
		for (ClassGrade classGrade : gradesResult) {
			System.out.println("班級:" + classGrade.getClassName());
			List<Student> list2 = classGrade.getStudents();
			for (Student student : list2) {
				System.out.println(student.getUserName() + ":" + format(student.getBrith()));
			}
		}
		
		System.out.println("========================================================");
		
		Student student = (Student) resultMap.get("student");
		System.out.println(student.getUserName() + ":" + format(student.getBrith()));
		
		System.out.println("========================================================");
		
		List<Student> studentsResult = (List<Student>) resultMap.get("students");
		for (Student student2 : studentsResult) {
			System.out.println(student2.getUserName() + ":" + format(student2.getBrith()));
		}
		
		System.out.println("========================================================");
	}
	public static String format(Date date) {
        String result = null;
        if (date != null) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            result = format.format(date);
        }
        return result;
    }
}

控制檯輸出:
Map-->JSON:{"students":[{"age":0,"brith":"2010-01-12","userName":"admin0"},{"age":1,"brith":"2010-02-13","userName":"admin1"}],"student":{"age":0,"brith":"2010-01-12","userName":"admin0"},"grade":{"className":"一班","students":[{"age":0,"brith":"2010-01-12","userName":"admin0"},{"age":1,"brith":"2010-02-13","userName":"admin1"}]},"grades":[{"className":"一班","students":[{"age":0,"brith":"2010-01-12","userName":"admin0"},{"age":1,"brith":"2010-02-13","userName":"admin1"}]},{"className":"二班","students":[{"age":0,"brith":"2010-01-12","userName":"admin0"},{"age":1,"brith":"2010-02-13","userName":"admin1"}]}]}
========================================================
班級:一班
admin0:2010-01-12
admin1:2010-02-13
========================================================
班級:一班
admin0:2010-01-12
admin1:2010-02-13
班級:二班
admin0:2010-01-12
admin1:2010-02-13
========================================================
admin0:2010-01-12
========================================================
admin0:2010-01-12
admin1:2010-02-13
========================================================