利用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了。
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了。
相关文章推荐
- 利用Jackson对Object,Map,List,数组,枚举,日期类等转化为json
- 利用Gson将Json 转化为Map,javaBean, List转换为json
- 利用java反射机制实现List<Map<String, Object>>转化为List<JavaBean>
- JSON对象中的JSONObject和JSONArray以及与Map、String、数组的转化
- json与(Object/List/Map)的相互转化
- 常用的json与map互相转化,json与数组互相转化,json与list互相转化
- 有趣Web之Json(四)---json与(Object/List/Map)相互转化
- Java读取json数组转化成List或Object数组
- java 后台使用gson 将json字符串转换为List<Map<String,object>> 数组
- 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换.
- 玩转Web之Json(四)---json与(Object/List/Map)的相互转化
- 整型-文件-方法名-日期-文件拷贝-缩略图-JSON创建-PDF-HTTP-单例-抓屏-目录-ZIP-XML-Map-邮件-Array-beanCopy-数组类型转换-数组集合转换-枚举示例
- java bean、List、数组、map和Json的相互转化
- 玩转Web之Json(四)---json与(Object/List/Map)的相互转化
- 玩转Web之Json(四)---json与(Object/List/Map)的相互转化
- JSON对象中的JSONObject和JSONArray以及与Map、String、数组的转化
- 一个小例子把map放到list里面,数组套JSONObject的方式
- Json学习笔记(一)-利用Fastjson将String转换成Map,List和数组
- java方式的将java对象以及list或者map转化为json数据,json转换为object或者map
- fastJSON把json转化成map,并转化成list,list如何装化为数组