将Json解析为Java对象

4

我遇到了这个问题:

Json:

{"authenticationToken":{"token":"c9XXXX1-XXXX-4XX9-XXXX-41XXXXX3XXXX"}}

对象:

    public class AuthenticationToken {
 public AuthenticationToken() {

 }

 public AuthenticationToken(String token) {
  authenticationToken = token;
 }

    @JsonProperty(value="token")
    private String authenticationToken;


 public String getAuthenticationToken() {
  return authenticationToken;
 }

 public void setAuthenticationToken(String authenticationToken) {
  this.authenticationToken = authenticationToken;
 }
}

但我在日志中发现了一个错误:无法读取JSON:Unrecognized field "authenticationToken"(class de.regalfrei.android.AuthenticationToken),未标记为可忽略的字段(已知属性: "token"]),我不知道如何正确设置JSON属性以解决这个问题。有人能帮我吗?

正如你所说,我添加了一个包装类:

public class AuthenticationTokenWrapper {
    AuthenticationToken authenticationToken;

    public AuthenticationTokenWrapper(AuthenticationToken authenticationToken) {
        this.authenticationToken = authenticationToken;
    }
    @JsonProperty(value="authenticationToken")
    public AuthenticationToken getAuthenticationToken() {
        return authenticationToken;
    }

    public void setAuthenticationToken(AuthenticationToken authenticationToken) {
        this.authenticationToken = authenticationToken;
    }

}

并调用了这个函数:

AuthenticationTokenWrapper tok =restTemplate.postForObject(url, requestEntity, AuthenticationTokenWrapper.class);

你可能需要在这里编写一个自定义反序列化器... - fge
1
要么使用 @JsonUnwrap 注解。 - fge
你使用的是哪个反序列化器? - Manu Viswam
我没有使用Spring的经验。我正在使用jackson反序列化器进行JSON反序列化。可以按以下方式完成。ObjectMapper mapper = new ObjectMapper(); AuthenticationTokenWrapper wrapper = mapper.readValue(jsonString, AuthenticationTokenWrapper.class);其中jsonString是包含JSON值的字符串。 - Manu Viswam
你实际上想要你的令牌序列化为{"authenticationToken": {"token": "whatever"}}还是只是{"token": "whatever"} - fge
显示剩余5条评论
3个回答

6

您正在使用一个包装类,其中有一个名为authenticationToken的变量,它是AuthenticationToken对象。

为了正确解析JSON,请创建一个像这样的包装类:

public class Wrapper {
private AuthenticationToken authenticationToken;

public Wrapper(AuthenticationToken authenticationToken) {
    this.authenticationToken = authenticationToken;
}

public AuthenticationToken getAuthenticationToken() {
    return authenticationToken;
}

public void setAuthenticationToken(AuthenticationToken authenticationToken) {
    this.authenticationToken = authenticationToken;
    }
}

1
嗨,谢谢。我得到了这个错误信息:找不到适合类型 [simple type, class de.myapp.android.AuthenticationTokenWrapper] 的构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息吗?) - ludwigmi
包装类中的 @JsonProperty(value="authenticationToken") 是否正确?我也尝试过使用 @JsonUnwrapped,但也不起作用。 - ludwigmi
我正在使用Jackson反序列化器,当getter和setter方法与变量名称相同时,不需要显式注释。其他反序列化器可能需要显式注释。 - Manu Viswam
我在哪里可以看到我使用的反序列化程序?我认为我也在使用Jackson! - ludwigmi
1
我不知道Spring会使用哪个反序列化器,我认为这篇文章会有所帮助。 - Manu Viswam
2
我已经解决了。restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); System.out.println(restTemplate.postForObject(url, requestEntity, String.class)); AuthenticationTokenWrapper tok =restTemplate.postForObject(url, requestEntity, AuthenticationTokenWrapper.class) ;我使用了 MappingJackson2HttpMessageConverter 而不是 MappingJacksonHttpMessageConverter。但现在它已经按照您的建议与包装类一起工作了! - ludwigmi

1

我不确定这个...

也许错误在这里 private String authenticationToken; 您说authenticationToken是一个字符串,但根据JSON对象它是另一个JSON对象。尝试将其转换为JSON对象并访问令牌。


嗨,你的意思和Manu Viswam一样对吧?我尝试过了,但不起作用 :( - ludwigmi
@ludwigmi 我不明白他在说什么... 我是说您可以将其作为 JSONObject 访问:a=new JSONObject('{"authenticationToken":{"token":"c9XXXX1-XXXX-4XX9-XXXX-41XXXXX3XXXX"}}'); 您可以将 token 访问为 Sysout(((JSONObject)a.get("authenticationToken")).get("token").toString()); 注意:我正在使用 org.json.jar 它对我有用。 - Karthik Surianarayanan
嗨,是的,我认为这会有效。但是我想把这个 JSON 加载到我的 Java 对象类 AuthenticationToken 中。 - ludwigmi

0

尝试

@JsonProperty(value="authenticationToken")
private String authenticationToken;

然后将该字符串反序列化为另一个类

@JsonProperty(value="token")
private String tokenStr;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接