使用Jackson替代FastJson进行json字符串和对象的相互转换

一、背景

在前后端分离的项目中,后端经常涉及到json与对象互转的场景。之前使用的是Fastjson,但是,因为技术选型的原因,选择了SpringBoot自带的Jackson。
这篇文章就简单的介绍下如何使用Jackson来进行json和对象的相互转换

二、使用

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Company {
    private String companyName;
    private List<WebSite> webSites;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebSite {
    private String webSiteName;
    private List<User> users;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String userId;
    private String username;
    private String password;
}

1.对象转json字符串Test

@Test
public void testObject2Json2() {
    User user2 = new User("1","上海辟谣专属队","职业辟谣,不信谣,不传谣,呵呵");
    List<User> users = new ArrayList<>();
    users.add(user2);
    WebSite webSite = new WebSite();
    webSite.setWebSiteName("xxxxxx.com");
    webSite.setUsers(users);
    List<WebSite> webSites = new ArrayList<>();
    webSites.add(webSite);
    Company company = new Company();
    company.setCompanyName("yyyyyy");
    company.setWebSites(webSites);
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        String jsonString = objectMapper.writeValueAsString(company);
        System.out.println(jsonString);
    } catch (JsonProcessingException e) {
        log.error("error: ", e);
    }
}

输出:

{"companyName":"yyyyyy","webSites":[{"webSiteName":"xxxxxx.com","users":[{"userId":"1","username":"上海辟谣专属队","password":"职业辟谣,不信谣,不传谣,呵呵"}]}]}

2.json字符串转对象

①json单字符串转单对象
@Test
public void testJson2Object() {
    String json = "{\"companyName\":\"yyyyyy\",\"webSites\":[" +
            "{\"webSiteName\":\"xxxxxx.com\",\"users\":[{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}]}" +
            "]}";
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        Company company = objectMapper.readValue(json, Company.class);
        System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());
    } catch (JsonProcessingException e) {
        log.error("error: ", e);
    }
}

输出:

上海辟谣专属队
②json数组字符串转list集合对象
@Test
public void testJsonArrayString2ObjectArray() {
    String json = "[" +
            "{\"userId\":\"1\",\"username\":\"上海带刀沪卫\",\"password\":\"带刀大佬\"}" +
            ",{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" +
            "]";
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        TypeReference<List<User>> typeReference = new TypeReference<List<User>>() {
        };
        List<User> list = objectMapper.readValue(json, typeReference);
        list.forEach(user -> {
            System.out.println(user.getUsername());
        });
    } catch (JsonProcessingException e) {
        log.error("error: ", e);
    }

注:为什么会由

有数组json的转换时,需要指定jackson反序列化为什么类型,而不是让它自主决定反序列化成什么类型,需要用到TypeReference

输出:

上海带刀沪卫
上海辟谣专属队

对多层嵌套同样适用

@Test
public void testJsonArrayString2ObjectArray2() {
    String json = "[" +
                "{" +
                "\"companyName\":\"yyyyyy\",\"webSites\":[" +
                        "{\"webSiteName\":\"xxxxxx.com\",\"users\":[" +
                            "{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" +
                            "]" +
                        "}" +
                    "]" +
                "}" +
            "]";
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        TypeReference<List<Company>> typeReference = new TypeReference<List<Company>>() {
        };
        List<Company> list = objectMapper.readValue(json, typeReference);
        list.forEach(company -> {
            System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());
        });
    } catch (JsonProcessingException e) {
        log.error("error: ", e);
    }
}

更复杂的使用可以看这篇文章
想使用FastJson的可以看这篇文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值