您的位置:首页 > 移动开发 > Objective-C

利用Jackson对Object,Map,List,数组,枚举,日期类等转化为json

2012-11-28 09:48 671 查看
利用Jackson中的ObjectMapper对象,转为对象为json字符串,springside对Jackson的简单封装 JsonBinder :

public class JsonBinder {

private static Logger logger = LoggerFactory.getLogger(JsonBinder.class);

private ObjectMapper mapper;

public JsonBinder(Inclusion inclusion) {

mapper = new ObjectMapper();

//设置输出包含的属性

mapper.getSerializationConfig().setSerializationInclusion(inclusion);

//设置输入时忽略JSON字符串中存在而Java对象实际没有的属性

mapper.getDeserializationConfig().set(

org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

}

/**

* 创建输出全部属性到Json字符串的Binder.

*/

public static JsonBinder buildNormalBinder() {

return new JsonBinder(Inclusion.ALWAYS);

}

/**

* 创建只输出非空属性到Json字符串的Binder.

*/

public static JsonBinder buildNonNullBinder() {

return new JsonBinder(Inclusion.NON_NULL);

}

/**

* 创建只输出初始值被改变的属性到Json字符串的Binder.

*/

public static JsonBinder buildNonDefaultBinder() {

return new JsonBinder(Inclusion.NON_DEFAULT);

}

/**

* 如果JSON字符串为Null或"null"字符串,返回Null.

* 如果JSON字符串为"[]",返回空集合.

*

* 如需读取集合如List/Map,且不是List<String>这种简单类型时使用如下语句:

* List<MyBean> beanList = binder.getMapper().readValue(listString, new TypeReference<List<MyBean>>() {});

*/

public <T> T fromJson(String jsonString, Class<T> clazz) {

if (StringUtils.isEmpty(jsonString)) {

return null;

}

try {

return mapper.readValue(jsonString, clazz);

} catch (IOException e) {

logger.warn("parse json string error:" + jsonString, e);

return null;

}

}

/**

* 如果对象为Null,返回"null".

* 如果集合为空集合,返回"[]".

*/

public String toJson(Object object) {

try {

return mapper.writeValueAsString(object);

} catch (IOException e) {

logger.warn("write to json string error:" + object, e);

return null;

}

}

/**

* 设置转换日期类型的format pattern,如果不设置默认打印Timestamp毫秒数.

*/

public void setDateFormat(String pattern) {

if (StringUtils.isNotBlank(pattern)) {

DateFormat df = new SimpleDateFormat(pattern);

mapper.getSerializationConfig().setDateFormat(df);

mapper.getDeserializationConfig().setDateFormat(df);

}

}

/**

* 取出Mapper做进一步的设置或使用其他序列化API.

*/

public ObjectMapper getMapper() {

return mapper;

}

}

在其他类中定义jsonBinder对象:

private static JsonBinder binder = JsonBinder.buildNonDefaultBinder();

以下是对象到json字符串以及json字符串到对象的转化:

/**

* 序列化对象/集合到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);

}

}

在我的实际项目中,遇到一个有意思的问题,我把一个对象转为为json字符串时,调用binder.toJson(bean) ,这个方法,方法总是返回null,后面发现该bean中没有默认的构造函数,加上某人构造函数就ok了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐