简体   繁体   English

杰克逊定制解串器没有被称为

[英]jackson custom deserializer not called

I have the following endpoint in retrofit: 我在改造中有以下端点:

@GET("user/detail")
Observable<JacksonResponse<User>> getUserDetail();

This endpoint returns the following result: 此端点返回以下结果:

{
  "code":1012,
  "status":"sucess",
  "message":"Datos Del Usuario",
  "time":"28-10-2015 10:42:04",
  "data":{
    "id_hash":977417640,
    "user_name":"Daniel",
    "user_surname":"Hdz Iglesias",
    "birthdate":"1990-02-07",
    "height":190,
    "weight":80,
    "sex":2,
    "photo_path":" https:\/\/graph.facebook.com
    \/422\/picture?width=100&height=100"
  }
}

Here is the definition of the class: 以下是该类的定义:

public class JacksonResponse<T> {

    private Integer code;
    private String status;
    private String message;
    private String time;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private T data;

    public JacksonResponse(){}

    @JsonCreator
    public JacksonResponse(
            @JsonProperty("code") Integer code,
            @JsonProperty("status") String status,
            @JsonProperty("message") String message,
            @JsonProperty("time") String time,
            @JsonProperty("data") T data) {
        this.code = code;
        this.status = status;
        this.message = message;
        this.time = time;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

}

I want the content "data" is mapped to the user class, whose extract show here: 我想将内容“data”映射到用户类,其摘录显示在这里:

@JsonIgnoreProperties(ignoreUnknown = true)
@ModelContainer
@Table(database = AppDatabase.class)
public class User extends BaseModel {

    @PrimaryKey(autoincrement = true)
    private Long id;
    @Column
    private Long idFacebook;
    @Column
    @JsonProperty("user_name")
    private String name;
    @Column
    @JsonProperty("user_surname")
    private String surname;
    @Column
    private Date birthday;
    @Column
    @JsonProperty("height")
    private Double height;
    @Column
    @JsonProperty("weight")
    private Double weight;
    @Column
    private String tokenFacebook;
    @Column
    @JsonProperty("sex")
    private Integer sex;
    @Column
    private String email;
    @Column
    private String token;
    @Column
    private Date lastActivity;
    @Column
    @JsonProperty("id_hash")
    private Long idHash;
    @Column
    @JsonProperty("photo_path")
    private String photoPath;

To birthdate, I have defined a custom deserializer, whose code show here: 为了生日,我定义了一个自定义反序列化器,其代码显示在这里:

public class BirthdayDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = jsonparser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

}

I am using this as follows (at User class): 我使用如下(在User类):

@JsonProperty("birthday")
@JsonDeserialize(using = BirthdayDeserializer.class)
public void setBirthday(Date birthday) {
  this.birthday = birthday;
}

but this is never called. 但这从未被召唤过。

Any idea what 's going on? 知道发生了什么事吗?

You Pojo and JSON does not map. 你Pojo和JSON没有映射。 You need to have a Data.java which should have properties as given in the JSON. 您需要一个Data.java ,它应具有JSON中给出的属性。 you classes should be as below based on the json given above. 根据上面给出的json,你的课程应该如下。

User.java User.java

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {

    @JsonProperty("code")
    public Integer code;
    @JsonProperty("status")
    public String status;
    @JsonProperty("message")
    public String message;
    @JsonProperty("time")
    public String time;
    @JsonProperty("data")
    public Data data;

}

Data.java Data.java

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data {

    @JsonProperty("id_hash")
    public Integer idHash;
    @JsonProperty("user_name")
    public String userName;
    @JsonProperty("user_surname")
    public String userSurname;
    @JsonProperty("birthdate")
    @JsonDeserialize(using = BirthdayDeserializer.class)
    public Date birthdate;
    @JsonProperty("height")
    public Integer height;
    @JsonProperty("weight")
    public Integer weight;
    @JsonProperty("sex")
    public Integer sex;
    @JsonProperty("photo_path")
    public String photoPath;

}

Main.java to test it. Main.java来测试它。

public class Main {

    public static void main(String[] args) throws IOException {

        String json = "{\n" +
                "    \"code\": 1012,\n" +
                "    \"status\": \"sucess\",\n" +
                "    \"message\": \"Datos Del Usuario\",\n" +
                "    \"time\": \"28-10-2015 10:42:04\",\n" +
                "    \"data\": {\n" +
                "        \"id_hash\": 977417640,\n" +
                "        \"user_name\": \"Daniel\",\n" +
                "        \"user_surname\": \"Hdz Iglesias\",\n" +
                "        \"birthdate\": \"1990-02-07\",\n" +
                "        \"height\": 190,\n" +
                "        \"weight\": 80,\n" +
                "        \"sex\": 2\n" +
                "    }\n" +
                "}";
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Date.class, new BirthdayDeserializer());
        mapper.registerModule(module);
        User readValue = mapper.readValue(json, User.class);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM