Преобразовать объект Spring @RequestBody JSON для сопоставления Java - PullRequest
0 голосов
/ 03 октября 2018

Я создаю конечную точку отдыха, у которой RequestBody будет объектом JSON:

@POST
@Path("/")
@Consumes("application/json")
@Produces(MediaType.APPLICATION_JSON)
@ValidateRequest
@ApiOperation(value = "updateDetails", nickname = "updateDetails")
@ApiResponses(value = {
        @ApiResponse(code = 200, message = "Success", response = responseVO.class),
        @ApiResponse(code = 401, message = "Unauthorized"),
        @ApiResponse(code = 403, message = "Forbidden"),
        @ApiResponse(code = 404, message = "Not Found"),
        @ApiResponse(code = 500, message = "Failure")})

public @Valid
    PortalResponseVO updateDetails( @RequestBody Object JSONObj){
    ...
    }

Мой запрос JSON будет выглядеть примерно так:

{
  name: "name1",
  description: "updating details by env",
  "env" : {
    "env1" : {
        "envName" : "envName1",
        "changeDesc" : "description1"
    },
    "env2" : {
         "envName" : "envName2",
        "changeDesc" : "description2"
    }
  }
 }

Я хочу отобразить объект JSONк объекту Java Map, чтобы я мог использовать детали, не создавая объектный класс для него.Однако, поскольку некоторые поля являются строками, а некоторые - вложенными картами, я немного не уверен в том, как анализировать объект.Я пытался использовать HashMap<String, Object> result = new ObjectMapper().readValue(JSONObj, HashMap.class);, но каждый раз, когда я пытаюсь получить доступ к полю типа String name = JSONObj.get("name"), я получаю сообщение об ошибке incompatible types: java.util.Map cannot be converted to java.lang.String

EDIT

С тех пор я изменил свой кодto:

public @Valid
PortalResponseVO updateDetails( @RequestBody Map<String, Object>t JSONObj){

  String name = (String) JSONObj.get("name");
  String desc = (String) JSONObj.get("description");

  Map<String, Object> env = (Map<String, Object>) JSONObj.get("env");
  Map<String, String> env1 = (Map<String, String>) env.get("env1");
  Map<String, String> env2 = (Map<String, String>) env.get("env2");
}

Я скомпилировал его, и он, кажется, компилируется просто отлично, но мне интересно, сработает ли это?Структура данных является статической, помимо имен и описаний, так что можно ли принудительно кастировать объекты таким образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...