Java Spring boot парсинг Json с несколькими вложениями

Всем привет. Есть JSON, который приходит в POST-запросе:

{
    "id": 12,
    "name": "Jovan Lee",
    "email": "[email protected]",
    "phone": "+49 176 14890478",
    "age": 32,
    "info": {
        "user": {
            "user_id": 123,
            "user_login": "test",
            "user_active": true
        }
    }
}

Контроллер:

@PostMapping(value = "/getUser", consumes = "application/json", produces = "application/json")
public ResponseEntity<?> create(@RequestBody GetUser getUser) throws FileNotFoundException {

  return new ResponseEntity<>("ok", HttpStatus.OK);
}

Вопрос, как "добраться" до user_id и user_login? Модели:

  import com.fasterxml.jackson.annotation.JsonProperty;
    
    import java.util.Map;
    
    public class Info{
    
        @JsonProperty("info")
        private Map<String, Object> info;
    
        public Map<String, Object> getInfo() {
            return info;
        }
    
        public void setInfo(Map<String, Object> info) {
            this.info=info;
        }
    }



    import com.fasterxml.jackson.annotation.JsonProperty;
    
    import java.util.Map;
    
    public class User{
    
        @JsonProperty("user")
        private Map<String, Object> user;
    
        public Map<String, Object> getUser() {
            return user;
        }
    
        public void setUser(Map<String, Object> user) {
            this.user=user;
        }
    }


import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Map;

public class Decrypt {

    private int user_id;
    private String user_login;
    private boolean user_active;

    @JsonProperty("info")
    private Info info;

    @JsonProperty("user")
    private User user;

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id= user_id;
    }

    public String getUser_login() {
        return user_login;
    }

    public void setUser_login(String user_login) {
        this.user_login= user_login;
    }

    public boolean getUser_active() {
        return user_active;
    }

    public void setUser_active(boolean user_active) {
        this.user_active= user_active;
    }

}

но getUser_login null... подскажите, как правильно описать парсинг Json? Спасибо!


Ответы (2 шт):

Автор решения: ChurKIT

Здесь отлично подойдет JsonPath

ссылка на гитхаб репо

Info info = JsonPath.parse(jsonString)
    .read("$.info", Info.class);//вместо jsonString твой response

User user = JsonPath.parse(jsonString)
    .read("$.info.user", User.class);//вместо jsonString твой response

Либо можешь попробовать создать сущность со всеми параметрами JSON'a и запарсить его с помощью Jackson

ссылка на гитхаб репо

ObjectMapper om = new ObjectMapper();
AllInfo allInfo = om.readValue(jsonString, AllInfo.class) //сущность с параметрами с приходящего JSON'a
Info info = allInfo.info;
User user = info.user;
→ Ссылка
Автор решения: Михаил Муругов

У Вас сложность написать модель GetUser?

import lombok.Data;


@Data
public class GetUser {
    private Integer id;
    private String name;
    private String email;
    private String phone;
    private Integer age;
    private Info info;
}

@Data
public class Info {
    private User user;
}

@Data
public class User {
    private Integer user_id;
    private String user_login;
    private Boolean user_active;
}

До нужных полей затем можете добраться через геттеры:

getUser.getInfo().getUser().getUser_id();
→ Ссылка