【问题标题】:Json Spring Boot Jackson How do I deserialise Json that has a child entity that has a namespace prefix?Json Spring Boot Jackson 如何反序列化具有具有命名空间前缀的子实体的 Json?
【发布时间】:2020-05-01 13:59:35
【问题描述】:

我正在尝试在我的 Spring Boot 服务器应用程序(使用 Jackson)中反序列化这个 json。它抛出一个 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field。前缀似乎是一个问题,我可以告诉杰克逊忽略 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)'''

【问题讨论】:

  • 请添加完整的堆栈跟踪
  • 作为补充,我无法控制前缀,因为它来自第三方应用程序。
  • 属性名称updatedAt也使用驼峰式而不是下划线。并阅读@JsonProperty注解

标签: json spring spring-boot jackson


【解决方案1】:

问题是 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;


}

【讨论】:

  • 非常感谢 Jens。那是一种享受。但我仔细注意到,属性名称必须是':'分隔而不是'/',因此语法与常规 url 的语法略有不同。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多