将java对象转换为json格式,然后将json转化为java对象遇到的问题

将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.打印结果,在反序列化过程中显示异常
  1. javaObject.userName:zevin
    2.将javaObject序列化成json格式字符串:
    {
    “user_name” : “zevin”
    }
    3.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of com.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方法
}

三.jackson的基于"对象绑定"的API跟setter方法和使用过@JsonProperty有关,说不清楚需要看源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值