我正在尝试将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
如果数据是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字符串要反序列化
您的解码后的字符串应该像这样,以便将其转换回您的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;
您将不需要此行,因为它已经作为字符串。
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"]
}