package org.springside.examples.showcase.json; import static org.junit.Assert.*; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.type.TypeReference; import org.joda.time.DateTime; import org.junit.Test; import org.springside.modules.utils.encode.JsonBinder; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * 测试Jackson对Object,Map,List,数组,枚举,日期类等的持久化. * * @author calvin */ public class JsonDemo { private static JsonBinder binder = JsonBinder.buildNonDefaultBinder(); /** * 序列化对象/集合到Json字符串. */ @Test public void toJson() throws Exception { //Bean TestBean bean = new TestBean("A"); String beanString = binder.toJson(bean); System.out.println("Bean:" + beanString); assertEquals("{\"name\":\"A\"}", beanString); //Map Map<String, Object> map = Maps.newLinkedHashMap(); map.put("name", "A"); map.put("age", 2); String mapString = binder.toJson(map); System.out.println("Map:" + mapString); assertEquals("{\"name\":\"A\",\"age\":2}", mapString); //List<String> List<String> stringList = Lists.newArrayList("A", "B", "C"); String listString = binder.toJson(stringList); System.out.println("String List:" + listString); assertEquals("[\"A\",\"B\",\"C\"]", listString); //List<Bean> List<TestBean> beanList = Lists.newArrayList(new TestBean("A"), new TestBean("B")); String beanListString = binder.toJson(beanList); System.out.println("Bean List:" + beanListString); assertEquals("[{\"name\":\"A\"},{\"name\":\"B\"}]", beanListString); //Bean[] TestBean[] beanArray = new TestBean[] { new TestBean("A"), new TestBean("B") }; String beanArrayString = binder.toJson(beanArray); System.out.println("Array List:" + beanArrayString); assertEquals("[{\"name\":\"A\"},{\"name\":\"B\"}]", beanArrayString); } /** * 从Json字符串反序列化对象/集合. */ @Test @SuppressWarnings("unchecked") public void fromJson() throws Exception { //Bean String beanString = "{\"name\":\"A\"}"; TestBean bean = binder.fromJson(beanString, TestBean.class); System.out.println("Bean:" + bean); //Map String mapString = "{\"name\":\"A\",\"age\":2}"; Map<String, Object> map = binder.fromJson(mapString, HashMap.class); System.out.println("Map:"); for (Entry<String, Object> entry : map.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue()); } //List<String> String listString = "[\"A\",\"B\",\"C\"]"; List<String> stringList = binder.getMapper().readValue(listString, List.class); System.out.println("String List:"); for (String element : stringList) { System.out.println(element); } //List<Bean> String beanListString = "[{\"name\":\"A\"},{\"name\":\"B\"}]"; List<TestBean> beanList = binder.getMapper().readValue(beanListString, new TypeReference<List<TestBean>>() { }); System.out.println("Bean List:"); for (TestBean element : beanList) { System.out.println(element); } } /** * 测试传入空对象,空字符串,Empty的集合,"null"字符串的结果. */ @SuppressWarnings("unchecked") @Test public void nullAndEmpty() { // toJson测试 // //Null Bean TestBean nullBean = null; String nullBeanString = binder.toJson(nullBean); assertEquals("null", nullBeanString); //Empty List List<String> emptyList = Lists.newArrayList(); String emptyListString = binder.toJson(emptyList); assertEquals("[]", emptyListString); // fromJson测试 // //Null String for Bean TestBean nullBeanResult = binder.fromJson(null, TestBean.class); assertNull(nullBeanResult); nullBeanResult = binder.fromJson("null", TestBean.class); assertNull(nullBeanResult); //Null/Empty String for List List nullListResult = binder.fromJson(null, List.class); assertNull(nullListResult); nullListResult = binder.fromJson("null", List.class); assertNull(nullListResult); nullListResult = binder.fromJson("[]", List.class); assertEquals(0, nullListResult.size()); } /** * 测试三种不同的Binder. */ @Test public void threeTypeBinders() { //打印全部属性 JsonBinder normalBinder = JsonBinder.buildNormalBinder(); TestBean bean = new TestBean("A"); assertEquals("{\"nullValue\":null,\"name\":\"A\",\"defaultValue\":\"hello\"}", normalBinder.toJson(bean)); //不打印nullValue属性 JsonBinder nonNullBinder = JsonBinder.buildNonNullBinder(); assertEquals("{\"name\":\"A\",\"defaultValue\":\"hello\"}", nonNullBinder.toJson(bean)); //不打印默认值未改变的nullValue与defaultValue属性 JsonBinder nonDefaultBinder = JsonBinder.buildNonNullBinder(); assertEquals("{\"name\":\"A\"}", nonDefaultBinder.toJson(bean)); } /** * 测试对枚举与日期的序列化. */ @Test public void enumAndDate() { //Enum会以名称(name)序列化. assertEquals("\"One\"", binder.toJson(TestEnum.One)); //Enum可以名称(name)或从0开始的顺序号(ordinal)反序列化. assertEquals(TestEnum.One, binder.fromJson("0", TestEnum.class)); assertEquals(TestEnum.One, binder.fromJson("\"One\"", TestEnum.class)); DateTime jodaDate = new DateTime(); //日期默认以Timestamp方式存储 Date date = new Date(jodaDate.getMillis()); String tsString = String.valueOf(jodaDate.getMillis()); assertEquals(tsString, binder.toJson(date)); assertEquals(date, binder.fromJson(tsString, Date.class)); //日期以设定日期格式的方式存储,考虑时区与Locale, 慎用. String dateString = "\"" + jodaDate.toString("yyyy-MM-dd") + "\""; binder.setDateFormat("yyyy-MM-dd"); assertEquals(dateString, binder.toJson(date)); Date dateResult = binder.fromJson(dateString, Date.class); System.out.println(dateResult); assertEquals(new DateTime(dateResult).getDayOfYear(), jodaDate.getDayOfYear()); } //此annoation为了截断对象的循环引用. @JsonIgnoreProperties( { "parent" }) public static class TestBean { private String name; private String defaultValue = "hello"; private String nullValue = null; private TestBean parent; public TestBean() { } public TestBean(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDefaultValue() { return defaultValue; } public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } public String getNullValue() { return nullValue; } public void setNullValue(String nullValue) { this.nullValue = nullValue; } public TestBean getParent() { return parent; } public void setParent(TestBean parent) { this.parent = parent; } @Override public String toString() { return "TestBean [defaultValue=" + defaultValue + ", name=" + name + ", nullValue=" + nullValue + "]"; } } public static enum TestEnum { One, Two, Three } }