我正在尝试反序列化一个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);
}