json越来越多的被用于数据传输格式了,那么在java应用程序后台中不免遇到就是要将后台数据转换成json用于网络传输,或是将前端传输过来的json字符串转换成响应的对象在程序中进行使用;那么在json和java对象互转的过程中具体会遇到哪些问题,或是有哪些容易忽略的bug呢?
1、首先是序列化问题,当让这个是应用在要将对象用于网络传输过程时才会遇到的,比如我们前端的app请求我们的后台处理程序时我们返回的对象数据就必须先被序列化才能用于网络传输,还有就是在分布式系统中,对象最为服务之间通信的数据载体也是必须被实例化的(当然这一项不是对象与json互转必须的,这里只是提醒下而已);
2、要转换成json的对象必须要包含无参构造方法,你可以默认不写任何构造方法,这样类会默认有一个无参的构造方法,但是如果你写了显示的构造方法的话,就必须显示的加上一个无参的构造方法了,否则转换过程也会抛出异常:
3、要转换的对象必须是标准的javabean对象,什么是标准的javabean对象呢?就是属性必须有与其对应的get或set方法,如果你的对象中有一个getXxx()方法,是业务逻辑处理中必须要用到的,但是没有与之对应的xxx属性时,在转换过程中也会抛出异常提示转换出错。那么这个时候如果这个方法是必须的话那么可以在方法的头上加上
@JsonIgnore注释,意思就是让转换时忽略这个方法的意思,这样在转换过程中就不会抛异常了;
4、好了,下面就贴上json与对象之间互相转换的类了,这里用的是jackson插件:
public class TestJson {
public static void main(String[] args) throws Exception {
User user = new User("zhangsan", 25);
ObjectMapper om = new ObjectMapper();
//设置对象中为空的字段就不要转了
om.setSerializationInclusion(Include.NON_NULL);
StringWriter w = new StringWriter();
om.writeValue(w, user);
//将对象转成json字符串
System.out.println("对象转换后的json字符串为:"+w.toString());
//在将json字符串转会对象
User u = om.readValue(w.toString(), User.class);
System.out.println("json字符串转换为对象:"+u.toString());
}
}
/**
* 注意该对象必须要提供无参的构造函数 ,不然 将json转换为对象时就会报错
* @author admin
*
*/
class User{
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
/**
* 转换过程中忽略该方法
* @return
*/
@JsonIgnore
public Integer getPrint(){
return 2;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
程序输出结果: