java~jackson實現接口的反序列化

jackson是springboot中集成的序列化方式,是默認的json序列化方式,固然你能夠使用其它的序列化工具代替它,不過今天咱們仍是說一下它,使用jackson進行序列化一個類,而後再把它的JSON字符反序列化爲它的接口對象。node

現實

  1. 這種方式默認是不行的,由於接口不能被自動實例化
  2. 使用redisTelmplete時,若是使用objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);這種試序列化,因爲會把實例類型寫到時 JSON裏,因此也不能反序列化爲接口

幾個序列化方式

一 序列化爲具體類型,沒法反序列化接口,即你用什麼類型序列化的,就用什麼類型反序列化,它常常與redis的序列化Jackson2JsonRedisSerializer一塊兒使用。redis

ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        User user = new User();
        user.setUsername("lind");
        user.setEmail("zzl@sina.com");
        String msg = om.writeValueAsString(user);

結果spring

["com.lind.common.JacksonTest$User",{"username":"lind","email":"zzl@sina.com","authorities":null}]

二 序列化爲字符串,主要好處是與類型無關,只要字段能夠配置上,就能夠反序列化,而且在自定義序列化器定義以後,還能夠對接口類型進行反序列化,能夠說更加方便。
定義一個序列化器json

public static class DefaultResourceUserSerializer extends JsonDeserializer<DefaultResourceUser> {

        @Override
        public DefaultResourceUser deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
                throws IOException {
            ObjectCodec oc = jsonParser.getCodec();
            JsonNode node = oc.readTree(jsonParser);
            DefaultResourceUser userAccountAuthentication = new DefaultResourceUser() {
                @Override
                public String getUsername() {
                    return node.get("username").asText();
                }

                @Override
                public String getEmail() {
                    return node.get("email").asText();
                }

                @Override
                public Collection<? extends GrantedAuthority> getAuthorities() {
                    List<GrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
                    Iterator<JsonNode> elements = node.get("authorities").elements();
                    while (elements.hasNext()) {
                        JsonNode next = elements.next();
                        JsonNode authority = next.get("authority");
                        simpleGrantedAuthorities.add(new SimpleGrantedAuthority(authority.asText()));
                    }
                    return simpleGrantedAuthorities;
                }
            };
            return userAccountAuthentication;
        }

在接口上使用它
``
@JsonDeserialize(using = DefaultResourceUserSerializer.class)
public interface DefaultResourceUser {
String getUsername();springboot

String getEmail();

    Collection<? extends GrantedAuthority> getAuthorities();
}
代碼展示了反序列化一個json字符串
json

{
"id": "347214418355949568",
"username": "admin",
"password": "{bcrypt}$2a$10$tVrm4VjC9BXF8PStUASZkOJCOm7mKR4ZVDHau.Ug/tm6ZEXEsHhcC",
"nickName": "測試",
"mobile": "",
"email": "",
"address": "北京",
"street": "",
"sex": 0,
"passStrength": "",
"avatar": "",
"type": 0,
"status": 0,
"description": "",
"departmentId": "",
"departmentTitle": null,
"resourcePermissions": [{
"id": "348193374957735936",
"title": "系統管理",
"path": "",
"type": 0,
"parentId": "",
"parent": null,
"sons": null
}, {
"id": "348193687223668737",
"title": "用戶管理",
"path": "/user",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}, {
"id": "348193868908335105",
"title": "添加用戶",
"path": "/user/add",
"type": 0,
"parentId": "348193687223668737",
"parent": null,
"sons": null
}, {
"id": "348193927590842369",
"title": "用戶列表",
"path": "/user/list
",
"type": 0,
"parentId": "348193687223668737",
"parent": null,
"sons": null
}, {
"id": "348194428344602626",
"title": "權限管理",
"path": "/permission/**",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}, {
"id": "348194428344602627",
"title": "權限添加",
"path": "/permission/add*",
"type": 0,
"parentId": "348194428344602626",
"parent": null,
"sons": null
}, {
"id": "348194428344602628",
"title": "角色管理",
"path": "/role/list",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}, {
"id": "348194428344602629",
"title": "demo",
"path": "/demo",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}],
"resourceRoles": null,
"enabled": true,
"authorities": [{
"authority": "用戶管理"
}, {
"authority": "添加用戶"
}, {
"authority": "用戶列表"
}, {
"authority": "權限管理"
}, {
"authority": "權限添加"
}, {
"authority": "角色管理"
}, {
"authority": "demo"
}],
"accountNonLocked": true,
"accountNonExpired": true,
"credentialsNonExpired": true
}app

代碼
@SneakyThrows
@Test
public void stringJackson() {
    DefaultResourceUser user = fromJson("jack.json", DefaultResourceUser.class);
    log.info("user:{}", user.getUsername());
    for (GrantedAuthority grantedAuthority : user.getAuthorities()) {
        log.info("auth:{}", grantedAuthority.getAuthority());
    }

}
結果

[1](https://img2020.cnblogs.com/blog/118538/202012/118538-20201209203450087-419672723.png)
相關文章
相關標籤/搜索