日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jackson java网络接口_java~jackson实现接口的反序列化

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jackson java网络接口_java~jackson实现接口的反序列化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jackson是springboot中集成的序列化方式,是默認的json序列化方式,當然你可以使用其它的序列化工具代替它,不過今天我們還是說一下它,使用jackson進行序列化一個類,然后再把它的JSON字符反序列化為它的接口對象。

現實

這種方式默認是不行的,因為接口不能被自動實例化

使用redisTelmplete時,如果使用objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);這種試序列化,由于會把實例類型寫到時 JSON里,所以也不能反序列化為接口

幾個序列化方式

一 序列化為具體類型,無法反序列化接口,即你用什么類型序列化的,就用什么類型反序列化,它經常與redis的序列化Jackson2JsonRedisSerializer一起使用。

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);

結果

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

二 序列化為字符串,主要好處是與類型無關,只要字段可以配置上,就可以反序列化,并且在自定義序列化器定義之后,還可以對接口類型進行反序列化,可以說更加方便。

定義一個序列化器

public static class DefaultResourceUserSerializer extends JsonDeserializer {

@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 simpleGrantedAuthorities = new ArrayList<>();

Iterator 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)

總結

以上是生活随笔為你收集整理的jackson java网络接口_java~jackson实现接口的反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。