Десериализация Json в нескольких объектах Java

#java #json #jackson

Вопрос:

Я пытаюсь десериализовать json :

 {
"date": "2021_05",
"uuid": "3ba8b966-993f-49e0-b349-e528843a382c",
"dataset": "dataset",
"hmm_hit": "hit",
"hmm_evalue": "6.7e-186",
"hmm_score": "610.9"  
},
 

У меня есть две сущности :

 @Entity
public class HmmResult {
 @Id
 @GeneratedValue
 @JsonIgnore
 private Integer id;

 @JsonProperty("hmm_hit")
 private String hmm;

 @JsonProperty("hmm_evalue")
 private String eValue;

 @JsonProperty("hmm_score")
 private Float score;
 }
 

и

 @Entity
public class Protein {
    @Id
    @GeneratedValue
    @JsonIgnore
    private Integer id;

    @JsonProperty("date")
    private String date;

    @JsonProperty("uuid")
    private String uuid;

    @JsonProperty("dataset")
    private String dataset;

   @OneToOne
   @JsonDeserialize(as = HmmResult.class)
   private HmmResult hmmResu<
 

Как десериализовать обе сущности одновременно с помощью одной записи json ?
Вот выдержка из main с помощью ObjectMapper Джексона :

 ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            Protein p = objectMapper.readValue(new File(file), Protein.class);
 

Он отлично анализирует «дату», «uuid» и «набор данных», но не может проанализировать объект HmmResult со значениями «hmm_subfamily», «hmm_evalue» и «hmm_score»: я получаю ошибку : p.getHmmResult() : null. (HmmResult hm = ObjectMapper.readValue(новый файл(файл), HmmResult.class); тоже отлично работает в одиночку).

Ответ №1:

Для этого есть @JsonUnwrapped аннотация. Должно работать так:

 public class Protein {
   @JsonProperty("date")
   private String date;

   @JsonProperty("uuid")
   private String uuid;

   @JsonProperty("dataset")
   private String dataset;

   @JsonUnwrapped
   private HmmResult hmmResu<
}

var protein = new ObjectMapper().readValue(new File(file), Protein.class);