java~jackson實現介面的反序列化
jackson是springboot中整合的序列化方式,是預設的json序列化方式,當然你可以使用其它的序列化工具代替它,不過今天我們還是說一下它,使用jackson進行序列化一個類,然後再把它的JSON字元反序列化為它的介面物件。
現實
- 這種方式預設是不行的,因為介面不能被自動例項化
- 使用redisTelmplete時,如果使用
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
這種試序列化,由於會把例項型別寫到時 JSON裡,所以也不能反序列化為介面
幾個序列化方式
一 序列化為具體型別,無法反序列化介面
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("[email protected]"); String msg = om.writeValueAsString(user);
結果
["com.lind.common.JacksonTest$User",{"username":"lind","email":"[email protected]","authorities":null}]
二 序列化為字串,主要好處是與型別無關,只要欄位可以配置上,就可以反序列化,並且在自定義序列化器定義之後,還可以對介面型別進行反序列化,可以說更加方便。
定義一個序列化器
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();
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
}
程式碼
@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)