Search code examples
javajsonrestjacksonobjectmapper

Jackson ObjectMapper readValue() unrecognized field when parsing to Object


I am creating simple rest client in Java/Spring. My request has been consumed properly by remote service and I got the response String something:

{"access_token":"d1c9ae1b-bf21-4b87-89be-262f6","token_type":"bearer","expires_in":43199,"grant_type":"client_credentials"}

The code below is the Object where I want to bind values from Json Response

package Zadanie2.Zadanie2;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

 public class Token {
String access_token;        
String token_type;
int expiresIn;
String grantType;
//////////////////////////////////////////////////////
public Token() {
    /////////////////////////////////
}
/////////////////////////////////////////////////////

public void setAccessToken(String access_token) {
    this.access_token=access_token;
}
public String getAccessToken() {
    return access_token;
}
////////////////////////////////////////////////
public void setTokenType(String token_type) {
    this.token_type=token_type;
}
public String getTokenType() {
    return token_type;
}
//////////////////////////////////////////////////////
public void setExpiresIn(int expiresIn) {
    this.expiresIn=expiresIn;
}
public int getExpiresIn() {
    return expiresIn;
}
//////////////////////////////////////////////////////////
public void setGrantType(String grantType) {
    this.grantType=grantType;
}
public String getGrantType() {
    return grantType;
}
}

all the time I am getting "unrecognized field access_token" but when I add objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); then access_token will be null

        jsonAnswer=template.postForObject(baseUriAuthorize, requestEntity,  String.class);  
        System.out.println(jsonAnswer);
        Token token=objectMapper.readValue(jsonAnswer, Token.class);
        System.out.println(token.getAccessToken());

I tried with @JsonProperty annotations. I tried with changing field by for example "@JsonProperty(accessToken)" because I thought there is an issue with "_" sign in variable name. I added getters and setters. Maybe there is a problem with the version I use but I don't think so because I am using "com.fasterxml.jackson.core"


Solution

  • Your setters do not match with the JSON key.

    To read it correctly, you should change your setters to:

    setAccess_token()
    setToken_type()
    ...
    

    But honestly, this is so ugly.

    Try following the Java bean name convention and customize the JSON key with @JsonProperty:

    public class Token {
            @JsonProperty("access_token")
            String accessToken;
             ....
    
    }