反序列化Json并将字段移动到内部对象



我正在尝试反序列化一个Json对象,它看起来像这样:

{
"score": 123
}

但我想把它存储在这样的对象中:

package com.torchai.service.informationunderstanding.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class MyObject {
private Scores scoreObject = new Scores();
@JsonIgnore
public double getScore() {
return scoreObject.getScore();
}
public void setScore(final double score) {
scoreObject.setScore(score);
}
@Getter
@Setter
@NoArgsConstructor
@ToString
public static class Scores {
private double score;
}
public static void main(String[] args) throws JsonProcessingException {
String json = "{ "score": 123 }";
final ObjectMapper objectMapper = new ObjectMapper();
final MyObject myObject = objectMapper.readValue(json, MyObject.class);
System.out.println("*** myObject: " + myObject);
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString((myObject)));
}
}

换句话说,我没有score字段。相反,我想将其存储在内部Scores对象中。

我认为,通过用@JsonIgnore注释getScore(),这将导致Jackson使用setter来设置对象中的字段。但是当序列化回Json时,只有内部Scores对象会被序列化,而不是getter。但我得到的结果是:

*** myObject: MyObject(scoreObject=MyObject.Scores(score=0.0))
{
"scoreObject" : {
"score" : 0.0
}
}

setter没有正确设置字段。如果我在getScore()上注释掉@JsonIgnore,那么我得到这个

*** myObject: MyObject(scoreObject=MyObject.Scores(score=123.0))
{
"scoreObject" : {
"score" : 123.0
},
"score" : 123.0
}

该值设置正确,但Jackson从getter输出隐式score字段以及scoreObject

如何使输出看起来像第一个示例,但具有正确的值?

备注

我知道我可以编写一个自定义的反序列化程序,但我认为这是一个足够简单的情况,我不需要这么做。

我认为您可以使用JsonUnwrapped

@JsonUnwrapped
private Scores scoreObject = new Scores();

如果您只想要;基元";分数显示在JSON表示中,则应将@JsonIgnore应用于scoreObject。像这样:


@JsonIgnore
private Scores scoreObject = new Scores();
public double getScore() {
return scoreObject.getScore();
}

请注意,输出不会像原始JSON那样完全是;您将它作为double存储在Scores类中,因此它将以这种方式输出:{ "score" : 123.0 }


另一方面,如果您的目标是使序列化表单看起来像

{
"scoreObject" : {
"score" : 123.0
}
}

然后需要对setScore()方法进行注释,告诉Jackson在哪里反序列化输入值:

private Scores scoreObject = new Scores();
public Scores getScoreObject() {
return scoreObject;
}
@JsonIgnore
public double getScore() {
return scoreObject.getScore();
}
@JsonProperty("score")
public void setScore(final double score) {
scoreObject.setScore(score);
}

最新更新