jackson-java对象的json序列化,非常蠢的经历(另附json正反序列化小demo+单例模式)

博主在使用Jackson进行Java对象的JSON序列化时遇到问题,发现新增的私有属性因缺少getter方法未能被序列化。在添加getter方法后,问题得到解决。此外,文章附带了一个Jackson使用的小demo和单例模式的应用。总结中提到,Jackson能正确实例化指定类,但未指定类型的Object会被转换为LinkedHashMap和ArrayList的键值对组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日常

总算是把版本2.0写完了,晚上通一通接口,看看还有哪些小bug。

今天说说我下午发现的关于java对象的json序列号的一个问题,大概就是在使用jackson的包序列化对象的时候,有两个我后来添加的成员怎么也无法被序列化!总是缺少那两个属性!

问题原因

丝毫没有办法的我,查了一通资料,竟然发现没有和我类似经历的人!只好自己找问题所在了……
其实实际问题是:我要序列化的那个对象,因为我新增了属性,而新增的属性我没有写getter,所以private是无法被jackson的包访问到的!

解决

写了getter之后,问题顺利解决

附:jackson包使用小demo+单例模式

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class JacksonDemo {
    //私有静态实例,赋值为空,延迟加载
    private static ObjectMapper objectMapper=null;
    //私有构造,防止实例化
    private JacksonDemo(){}
    //静态方法创建单个实例
    public static ObjectMapper getObjectMapper(){
        if(objectMapper==null){
            objectMapper=new ObjectMapper();
        }
        return objectMapper;
    }

    private static String toJson(Object object) throws JsonProcessingException {
        //java对象序列化为Json字符串
        return getObjectMapper().writeValueAsString(object);
    }

    private static <T> T  fromJson(String json,Class<T> type) throws IOException {
        //将Json字符串反序列化为java对象
        return getObjectMapper().readValue(json,type);
    }

    public static void main(String[] args) {
        //status是一个有三个私有属性的类,分别是String status,String msg,Object data;
        Status status=new Status();
        status.setData("abc");
        try {
            //将status输出为json字符串
            System.out.println(toJson(status));
            //将json字符串转换为Status对象
            String json="{\"status\":\"success\",\"msg\":\"seller goods found successfully!\",\"data\":[{\"id\":\"014352373888\",\"name\":\"%E4%BC%91%E9%97%B2%E5%A8%B1%E4%B9%90+%E6%91%84%E5%BD%B1%E4%B9%8B%E5%9C%B0\",\"price\":128.0,\"city\":null,\"route\":null,\"pictures\":[\"/img/goods/014352373888/1.png\"],\"description\":null,\"comment\":null,\"seller\":{\"headPicture\":\"/img/headPic.png\",\"phoneNumber\":\"11111111111\",\"sex\":null,\"name\":\"testuser\"},\"pubtime\":\"1514523738880\"}]}";
            Status s=fromJson(json,Status.class);
            System.out.println(s.getStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

结果如图,emmmmmm。

  • 这里可以看到转换成json字符串就比较单一
  • 转换成java对象,仔细看小框:对于我给出的class文件,它会正确的实例化这个类,而我类里的Object对象由于没有特定的类,所以默认键值对是使用的LinkedHashMap,而键值对之间的数组使用的是ArrayList
    结果

PS:2018年快乐!
关于Jackson注解的内容参考大佬的文章 Jackson常用注解介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值