Complex Json to Nested POJO spring MVC

Sam Thomas Source

I am trying to get the following Json into POJOS using @RequestBody Instance instance

{
  "service_id": "service-id-here",
  "plan_id": "plan-id-here",
  "context": {
    "platform": "cloudfoundry",
    "some_field": "some-contextual-data"
  },
  "organization_guid": "org-guid-here",
  "space_guid": "space-guid-here",
  "parameters": {
    "agent_name": 1,
    "url": "foo",
    "credential": "asdasd",
    "ia_url": "asdasd"
  }
}

Below are my POJOs

Instance

public class Instance {
    @JsonProperty(value = "service_id")
    String serviceId;
    @JsonProperty(value = "plan_id")
    String planId;
    //TODO : Replace with Context class when the spec defines things clearly
    @JsonProperty(value = "context")
    Object context;
    @JsonProperty(value = "organization_guid")
    String organizationGuid;
    @JsonProperty(value = "space_guid")
    String spaceGuid;
    @JsonProperty(value = "parameters")
    Parameters parameters;
}

Parameters

    public class Parameters {
        @JsonProperty(value = "agent_name")
        String agentName;
        @JsonProperty(value = "url")
        String url;
        @JsonProperty(value = "credential")
        String credential;
        @JsonProperty(value = "ia_url")
        String iaUrl;
}

I use @JsonProperty everywhere. Is there any way to get underscore separated json keys into java's naming convention for variables (Camelcase)??

I tried using @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) to my POJO classes instead of the @JsonProperty for each parameter. I just get an empty json {} in instance. What am I missing here?

javajsonspring-mvcpojo

Answers

answered 5 days ago Sankar #1

Yes, is this possible using PropertyNamingStrategy class through JsonNaming annotation

Ex:

@JsonNaming(PropertyNamingStartergy.LowerCaseWithUnderscoresStrategy.class)
class Class_name{
  ...
}

//---- The below code has updated. In that code am using

PropertyNamingStrategy.SnakeCaseStrategy

Working code (TESTED).

Getters and setters are important for this to work. But @JsonProperty does not require them

User.java

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class User {
    private int id;
    private String beanName;
    private Role role;


    public Role getRole() {
        return role;
    }
    public void setRole(Role role) {
        this.role = role;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getBeanName() {
        return beanName;
    }
    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

}

Role.java

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Role {
    private int id;
    private String roleName;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

}

Here is the Controller

@RestController
@RequestMapping("/test")
public class NamingController {

    @RequestMapping(value="/jsontopojo", method = RequestMethod.POST)
    public ResponseEntity<User> jsontopojo(@RequestBody User nam) {
        return new ResponseEntity<User>( nam, HttpStatus.OK);
    }

}

enter image description here

comments powered by Disqus