将java对象转换为json格式,然后将json转化为java对象遇到的问题
`````
一、正常情况下
1.第一个类
package com.zevin;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User1 {
@JsonProperty("user_name")//把属性的名称序列化时转换为另外一个名称,即userName->user_name
private String userName;//采用驼峰命名原则
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2.第二个类
package com.zevin;
public class User2 {
private String user_name;//数据库命名规则
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
}
3.测试类
@Test
public void test01() throws JsonProcessingException {
//创建javaObject
User1 user1 = new User1();
user1.setUserName("zevin");
System.out.println("javaObject.userName:"+user1.getUserName()+"\n");
//创建基于"对象绑定"解析的相关API,即ObjectMapper(内置一对ObjectWriter和ObjectReader)
ObjectMapper mapper = new ObjectMapper();
//javaObject->JsonString,即调用ObjectWriter进行序列化
String JsonStringByUser1 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user1);
System.out.println("将javaObject序列化成json格式字符串:\n"+JsonStringByUser1+"\n");
//JsonString->javaObject,即调用ObjectReader进行反序列化
User2 user2 = mapper.readValue(JsonStringByUser1, User2.class);
System.out.println("将json格式字符串反序列化成javaObject:\njavaObject.user_name:"+user2.getUser_name()+"\n");
}
4.打印结果,显示正常
1.javaObject.userName:zevin
2.将javaObject序列化成json格式字符串:
{
“user_name” : “zevin”
}
3.将json格式字符串反序列化成javaObject:
javaObject.user_name:zevin
`````
二、加上有参构造方法,出现异常
1.其他不变,修改第二个类
public class User2 {
private String user_name;//数据库命名规则
public User2(String user_name) {
this.user_name = user_name;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
}
2.打印结果,在反序列化过程中显示异常
- javaObject.userName:zevin
2.将javaObject序列化成json格式字符串:
{
“user_name” : “zevin”
}
3.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance ofcom.zevin.User2
(although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)“{
“user_name” : “zevin”
}”; line: 2, column: 3]
3.解决方法:去掉有参构造,或者增加无参构造
`````
三、java对象和json的属性名不一致,出现异常
1.其他不变,修改第二个类
package com.zevin;
public class User2 {
private String userName;//跟第一类属性名保持一致
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2.打印结果,在反序列化过程中显示异常
1.javaObject.userName:zevin
2.将javaObject序列化成json格式字符串:
{
“user_name” : “zevin”
}
3.com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field “user_name” (class com.zevin.User2), not marked as ignorable (one known property: “userName”])
at [Source: (String)“{
“user_name” : “zevin”
}”; line: 2, column: 18] (through reference chain: com.zevin.User2[“user_name”])
3.解决方法:将setUserName方法改成setUser_name()即可,或者加上@JsonProperty("user_name")和第一个类保持一致
`````
四、删除setter方法,出现异常
1.其他不变,修改第二个类
package com.zevin;
public class User2 {
private String user_name;//json属性名保持一致
public String getUser_name() {
return user_name;
}
//public void setUserName(String userName) {
// this.userName = userName;
//}
}
2.打印结果,在反序列化过程中显示异常
javaObject.userName:zevin
将javaObject序列化成json格式字符串:
{
“user_name” : “zevin”
}
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field “user_name” (class com.zevin.User2), not marked as ignorable (0 known properties: ])
at [Source: (String)“{
“user_name” : “zevin”
}”; line: 2, column: 18] (through reference chain: com.zevin.User2[“user_name”])
3.解决方法:加上setter方法,方法名必须是setUser_name(),或者加上@JsonProperty("user_name")
`````
五、同时使用@JsonProperty和sertter方法,但是不一致
1.其他不变,修改第二个类
package com.zevin;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User2 {
@JsonProperty("user_name")
private String userName;//跟第一类属性名保持一致
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2.打印结果显示正常,再测试以下案例,继续修改第二个类
package com.zevin;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User2 {
@JsonProperty("userName")
private String userName;//跟第一类属性名保持一致
public String getUserName() {
return userName;
}
public void setUser_name(String userName) {
this.userName = userName;
}
}
3.打印结果显示还是正常
`````
结论
一.java对象只要满足以下任一情形,就可以正常生成:
1.该对象属性上@JsonProperty的value值和json属性名相同
2.该对象属性的setter方法的方法名和json属性名相同
即java对象中的@JsonProperty("prop")或setProp()和json中 {"prop":"value"}的prop值一致即可
二.特殊情形,无法生成
1.用第一个类的java对象生成jsonString
public class User1 {
@JsonProperty("user_name")
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
2.用jsonString生成第二个类的java对象,即使属性名相同也会报错
public class User2 {
private String user_name;
public String getUserName() {
return user_name;
}
//没有@JsonProperty和setter方法
}