解码为jsonString后转换base64令牌

问题描述 投票:0回答:3

我正在尝试将json strign转换为我各自的pojo类。 json字符串是base64 token的解码版本。解码值为{"userId":"1234567890","userName": "John Doe", roles: ["admin","users"]}

我正在使用代码String jsonFormat=objectMapper.writeValueAsString(decoded);,其中解码是在上面提到的字符串上

当我尝试使用objectmapper将其转换为对象时,出现以下错误

objectMapper.readValue(jsonFormat, PtsbUser.class);

错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.ptsb.rbaccomponent.models.PtsbUser` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{userId:"1234567890",userName: "John Doe", roles: ["admin","users"]}


    ')
 at [Source: (String)""{userId:\"1234567890\",userName: \"John Doe\", roles: [\"admin\",\"users\"]}\n     \n  \n    ""; line: 1, column: 1]

我也更新了已解码的字符串,并在密钥中加上了括号。我正在使用https://www.base64encode.org/编码的base64,这给了我令牌

eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwidXNlck5hbWUiOiAiSm9obiBEb2UiLCByb2xlczogWyJhZG1pbiIsInVzZXJzIl19CiAgICAgCiAgCiAgICA=

我正在使用下面的实用程序代码来获取我的解码字符串:

Base64.getDecoder().decode(encoded);
        String decripted=new String (decoded);
        return decripted
java json objectmapper
3个回答
1
投票

如果数据是bas64编码的json字符串,则可以这样:

objectMapper.readValue(Base64.getDecoder().decode(data),  PtsbUser.class);

但是您的原始字符串无效 json:

{userId:"1234567890",userName: "John Doe", roles: ["admin","users"]}  

这是有效的:

{"userId":"1234567890","userName": "John Doe", "roles": ["admin","users"]}

objectMapper.writeValueAsString可用于将任何Java值序列化为字符串的方法

objectMapper.writeValueAsString(decoded);在这里不需要因为此方法用于java -> json序列化,并且您已经有json字符串要反序列化


1
投票

您的解码后的字符串应该像这样,以便将其转换回您的java对象(即PtsbUser)。

"{\"userId\":\"1234567890\",\"userName\": \"John Doe\", \"roles\": [\"admin\",\"users\"]}";

但是从错误中我可以看到您解码的json字符串是

"{userId:\"1234567890\",userName: \"John Doe\", roles: [\"admin\",\"users\"]}\n     \n  \n    "";

[这里,我不确定您是如何解码json字符串的,一旦您的json字符串将如上所示正确解码,您可以使用以下代码如下将其转换为PtsbUser对象,

 String decoded = "{\"userId\":\"1234567890\",\"userName\": \"John Doe\", \"roles\": [\"admin\",\"users\"]}";
 ObjectMapper objectMapper = new ObjectMapper();
 PtsbUser ptsbUser = objectMapper.readValue(decoded, PtsbUser.class);
 System.out.println(ptsbUser);

而且我也希望您的PtsbUser.java类看起来像这样。

public class PtsbUser {

    String userId;
    String userName;
    List<String> roles;
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public List<String> getRoles() {
        return roles;
    }
    public void setRoles(List<String> roles) {
        this.roles = roles;
    }
}

这是解码字符串的方法

String inputToDecode = "eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwidXNlck5hbWUiOiAiSm9obiBEb2UiLCByb2xlczogWyJhZG1pbiIsInVzZXJzIl19CiAgICAgCiAgCiAgICA=";
Decoder decoder = Base64.getDecoder();
String decodedString = new String(decoder.decode(inputToDecode ), "UTF-8");
return decodedString;

0
投票

您将不需要此行,因为它已经作为字符串。

  String jsonFormat = objectMapper.writeValueAsString(decoded);

这将在解码后的字符串周围加上双引号。仅在将字符串写入输出/响应时使用此方法。

您可以直接在readValue方法中使用解码后的字符串

objectMapper.readValue(decoded, PtsbUser.class);

并且您的JSON出现问题。您可以在https://jsonlint.com/

上验证JSON

这里,您需要用双引号引起来的密钥,以使其成为有效的JSON

{
  "userId": "1234567890",
  "userName": "John Doe",
  "roles": ["admin", "users"] 
}
© www.soinside.com 2019 - 2024. All rights reserved.