Преобразование токена base64 после декодирования в jsonString - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь преобразовать строку json в соответствующий класс pojo. Строка json является декодированной версией токена base64.
Декодированные значения:

{"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

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Ваша декодированная строка должна быть такой, чтобы преобразовать ее обратно в ваш java объект (т. Е. PtsbUser).

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

Но здесь, по ошибке, я мог видеть ваш декодированный json string is

"{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

String inputToDecode = "eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwidXNlck5hbWUiOiAiSm9obiBEb2UiLCByb2xlczogWyJhZG1pbiIsInVzZXJzIl19CiAgICAgCiAgCiAgICA=";
Decoder decoder = Base64.getDecoder();
String decodedString = new String(decoder.decode(inputToDecode ), "UTF-8");
return decodedString;
1 голос
/ 11 марта 2020

если данные в кодировке 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 для десериализации

0 голосов
/ 11 марта 2020

Вам не понадобится эта строка, так как она уже есть в строке.

  String jsonFormat = objectMapper.writeValueAsString(decoded);

Это поместит двойные кавычки вокруг вашей декодированной строки. Этот метод используется только тогда, когда вы пишете свою строку в вывод / ответ.

Вы можете напрямую использовать декодированную строку в методе readValue

objectMapper.readValue(decoded, PtsbUser.class);

И у вашего JSON есть проблемы. Вы можете подтвердить свой JSON на https://jsonlint.com/

Здесь вам нужно заключить ключи в двойные кавычки, чтобы сделать его действительным JSON

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