/*******************************************************************************
* Copyright (c) 2005, 2014 springside.github.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
*******************************************************************************/
package org.springside.modules.utils.mapper;
import static org.assertj.core.api.Assertions.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.junit.Test;
import org.springside.modules.utils.mapper.JsonMapper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
* 测试Jackson对Object,Map,List,数组,枚举,日期类等的持久化. 更多测试见showcase中的JsonDemo.
*/
public class JsonMapperTest {
/**
* 序列化对象/集合到Json字符串.
*/
@Test
public void toJson() throws Exception {
// Bean
TestBean bean = new TestBean("A");
String beanString = JsonMapper.INSTANCE.toJson(bean);
System.out.println("Bean:" + beanString);
assertThat(beanString)
.isEqualTo("{\"name\":\"A\",\"defaultValue\":\"hello\",\"nullValue\":null,\"emptyValue\":[]}");
// Map
Map<String, Object> map = Maps.newLinkedHashMap();
map.put("name", "A");
map.put("age", 2);
String mapString = JsonMapper.INSTANCE.toJson(map);
System.out.println("Map:" + mapString);
assertThat(mapString).isEqualTo("{\"name\":\"A\",\"age\":2}");
// List<String>
List<String> stringList = Lists.newArrayList("A", "B", "C");
String listString = JsonMapper.INSTANCE.toJson(stringList);
System.out.println("String List:" + listString);
assertThat(listString).isEqualTo("[\"A\",\"B\",\"C\"]");
// List<Bean>
List<TestBean> beanList = Lists.newArrayList(new TestBean("A"), new TestBean("B"));
String beanListString = JsonMapper.INSTANCE.toJson(beanList);
System.out.println("Bean List:" + beanListString);
assertThat(beanListString).isEqualTo(
"[{\"name\":\"A\",\"defaultValue\":\"hello\",\"nullValue\":null,\"emptyValue\":[]},{\"name\":\"B\",\"defaultValue\":\"hello\",\"nullValue\":null,\"emptyValue\":[]}]");
// Bean[]
TestBean[] beanArray = new TestBean[] { new TestBean("A"), new TestBean("B") };
String beanArrayString = JsonMapper.INSTANCE.toJson(beanArray);
System.out.println("Array List:" + beanArrayString);
assertThat(beanArrayString).isEqualTo(
"[{\"name\":\"A\",\"defaultValue\":\"hello\",\"nullValue\":null,\"emptyValue\":[]},{\"name\":\"B\",\"defaultValue\":\"hello\",\"nullValue\":null,\"emptyValue\":[]}]");
}
/**
* 从Json字符串反序列化对象/集合.
*/
@Test
public void fromJson() throws Exception {
// Bean
String beanString = "{\"name\":\"A\"}";
TestBean bean = JsonMapper.INSTANCE.fromJson(beanString, TestBean.class);
System.out.println("Bean:" + bean);
// Map
String mapString = "{\"name\":\"A\",\"age\":2}";
Map<String, Object> map = JsonMapper.INSTANCE.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 = JsonMapper.INSTANCE.fromJson(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 = JsonMapper.INSTANCE.fromJson(beanListString,
JsonMapper.INSTANCE.buildCollectionType(List.class, TestBean.class));
System.out.println("Bean List:");
for (TestBean element : beanList) {
System.out.println(element);
}
}
/**
* 测试传入空对象,空字符串,Empty的集合,"null"字符串的结果.
*/
@Test
public void nullAndEmpty() {
// toJson测试 //
// Null Bean
TestBean nullBean = null;
String nullBeanString = JsonMapper.INSTANCE.toJson(nullBean);
assertThat(nullBeanString).isEqualTo("null");
// Empty List
List<String> emptyList = Lists.newArrayList();
String emptyListString = JsonMapper.INSTANCE.toJson(emptyList);
assertThat(emptyListString).isEqualTo("[]");
// fromJson测试 //
// Null String for Bean
TestBean nullBeanResult = JsonMapper.INSTANCE.fromJson(null, TestBean.class);
assertThat(nullBeanResult).isNull();
nullBeanResult = JsonMapper.INSTANCE.fromJson("null", TestBean.class);
assertThat(nullBeanResult).isNull();
// Null/Empty String for List
List nullListResult = JsonMapper.INSTANCE.fromJson(null, List.class);
assertThat(nullListResult).isNull();
nullListResult = JsonMapper.INSTANCE.fromJson("null", List.class);
assertThat(nullListResult).isNull();
nullListResult = JsonMapper.INSTANCE.fromJson("[]", List.class);
assertThat(nullListResult).isEmpty();
}
/**
* 测试三种不同的Mapper.
*/
@Test
public void threeTypeMappers() {
// 打印全部属性
JsonMapper normalBinder = JsonMapper.defaultMapper();
TestBean bean = new TestBean("A");
assertThat(normalBinder.toJson(bean))
.isEqualTo("{\"name\":\"A\",\"defaultValue\":\"hello\",\"nullValue\":null,\"emptyValue\":[]}");
// 不打印nullValue属性
JsonMapper nonNullMapper = JsonMapper.nonNullMapper();
assertThat(nonNullMapper.toJson(bean))
.isEqualTo("{\"name\":\"A\",\"defaultValue\":\"hello\",\"emptyValue\":[]}");
// 不打印nullValue与empty的属性
JsonMapper nonEmptyMapper = JsonMapper.nonEmptyMapper();
assertThat(nonEmptyMapper.toJson(bean)).isEqualTo("{\"name\":\"A\",\"defaultValue\":\"hello\"}");
TestBean nonEmptyBean = nonEmptyMapper.fromJson("{\"name\":\"A\",\"defaultValue\":\"hello\"}", TestBean.class);
assertThat(nonEmptyBean.getEmptyValue()).isEmpty();
}
@Test
public void jsonp() {
TestBean bean = new TestBean("A");
String jsonp = JsonMapper.nonEmptyMapper().toJsonP("haha", bean);
assertThat(jsonp).isEqualTo("haha({\"name\":\"A\",\"defaultValue\":\"hello\"})");
}
@Test
public void update() {
TestBean bean = new TestBean("A");
bean.setDefaultValue("lalala");
JsonMapper.INSTANCE.update("{\"name\":\"B\"}", bean);
assertThat(bean.getName()).isEqualTo("B");
assertThat(bean.getDefaultValue()).isEqualTo("lalala");
}
public static class TestBean {
private String name;
private String defaultValue = "hello";
private String nullValue = null;
private List<String> emptyValue = new ArrayList();
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 List<String> getEmptyValue() {
return emptyValue;
}
public void setEmptyValue(List<String> emptyValue) {
this.emptyValue = emptyValue;
}
@Override
public String toString() {
return "TestBean [name=" + name + ", defaultValue=" + defaultValue + ", nullValue=" + nullValue
+ ", emptyValue=" + emptyValue + "]";
}
}
}