如何从 io.jsonwebtoken.Claims 转换为 java.util.Map<String,Object>?

Posted

技术标签:

【中文标题】如何从 io.jsonwebtoken.Claims 转换为 java.util.Map<String,Object>?【英文标题】:How to convert from io.jsonwebtoken.Claims to java.util.Map<String,Object>? 【发布时间】:2017-09-28 18:52:29 【问题描述】:

我正在使用 io.jsonwebtoken maven 依赖项处理 JWT 令牌。

我能够成功创建带有自定义负载的 JWT 令牌。

现在我要去parse 它,我需要Map&lt;String, Object&gt; 对象其中包含在创建时添加的所有自定义有效负载,但不幸的是我无法完成它.

我正在使用下面的代码来解析它,

JwtParser parser = Jwts.parser();
Claims claims = parser
                .setSigningKey(DatatypeConverter.parseBase64Binary(SIGN_KEY))
                        .parseClaimsJws(jwt).getBody();

现在,我有 io.jsonwebtoken.Claims ,但不知道如何将这个 io.jsonwebtoken.Claims 转换为 java.util.Map&lt;String,Object&gt;

但是我尝试用这个来知道(我想要的几乎看起来相似):-

System.out.println(claims.toString()); -> this is correctly prints whole custom payloads.

但我需要Map&lt;String,Object&gt;

任何帮助将不胜感激..!!

【问题讨论】:

【参考方案1】:

io.jsonwebtoken.Claims 扩展 java.util.Map&lt;String, Object&gt;

io.jsonwebtoken.impl.DefaultClaimsClaims 唯一提供的实现,是他们的 Map 实现,它装饰了 LinkedHashMap&lt;String, Object&gt; 并添加了几个方法。

所以你不应该做任何事情来转换为Map,因为它已经是Map&lt;String, Object&gt;。 如果您想摆脱他们的自定义方法并将Claims 转换为HashMap,最短的方法是将Claims 传递给HashMap 的构造函数。它与您手动执行的操作相同。

Claims claims = ...; 

Map<String, Object> expectedMap = new HashMap<>(claims);

【讨论】:

【参考方案2】:

最后,我通过自己的聆听得到了答案——在得到答案之前不要停下来,

public Map<String, Object>  getMapFromIoJsonwebtokenClaims(Claims claims)
    Map<String, Object> expectedMap = new HashMap<String, Object>();
    for(Entry<String, Object> entry : claims.entrySet()) 
        expectedMap.put(entry.getKey() , entry.getValue());
    
    return expectedMap;

【讨论】:

以上是关于如何从 io.jsonwebtoken.Claims 转换为 java.util.Map<String,Object>?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?