Json Spring Boot Jackson Как десериализовать Json, у которого есть дочерний объект с префиксом пространства имен? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь десериализовать этот json в моем приложении сервера Spring Boot (которое использует Джексона). Выдает com.faster xml .jackson.databind.ex c .UnrecognizedPropertyException: нераспознанное поле. Кажется, префикс является проблемой, и я могу сказать Джексону игнорировать поле user_metadata, и оно работает нормально, однако мне нужно получить доступ к этому значению. Я просмотрел различные аннотации Spring @ Json, и ни одна из них не имела отношения к префиксу.

{
   "sub":"",
   "nickname":"",
   "name":"",
   "picture":"",
   "updated_at":"2020-05-01T11:23:01.110Z",
   "email":"",
   "email_verified":false,
   "https://somedomain:eu:auth0:com/user_metadata":{
      "tennant":"value"
   }
}

И классы моделей в Java

public class UserMetaData {

    private String tennant;

    public String getTennant() {
        return tennant;
    }

    public void setTennant(String tennant) {
        this.tennant = tennant;
    }

}


public class UserInfo {

    private String email;

    private String sub;

    private String picture;

    private String nickname;

    private Date updated_at;

    private boolean email_verified;

    private UserMetaData user_metadata;

    private String name;


}

Для краткости убраны геттеры и сеттеры

Трассировка стека ниже: -

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "https://raptorsoftware:eu:auth0:com/user_metadata" (class uk.co.raptorsoftware.domain.UserInfo), not marked as ignorable (8 known properties: "sub", "user_metadata", "updated_at", "name", "email", "picture", "email_verified", "nickname"])
 at [Source: (String)"{"sub":"","nickname":"darren.roberts","name":"","picture":"https://s.gravatar.com/avatar/c496e319edc303163f2e87e5ca91507d?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fda.png","updated_at":"2020-05-01T16:39:11.271Z","email":"darren.roberts@","email_verified":false,"https://raptorsoftware:eu:auth0:com/user_metadata":{"tennant":"some value"}}"; line: 1, column: 411] (through reference chain: uk.co.raptorsoftware.domain.UserInfo["https://raptorsoftware:eu:auth0:com/user_metadata"])
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:840)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1206)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1592)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1570)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
    at uk.co.raptorsoftware.web.BaseController.getUserInfo(BaseController.java:49)
    at uk.co.raptorsoftware.web.MemberController.listMembers(MemberController.java:49)'''

1 Ответ

1 голос
/ 02 мая 2020

Проблема заключается в URL-адресе в качестве ключа UserMetaData. Попробуйте использовать @JsonProperty

public class UserInfo {

    private String email;

    private String sub;

    private String picture;

    private String nickname;

    private Date updated_at;

    private boolean email_verified;

    @JsonProperty(name="https://somedomain:eu:auth0:com/user_metadata")
    private UserMetaData user_metadata;

    private String name;


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