有一个类内部有另一个静态类。Jackson在反序列化JSON时调用setter。但某些设置器不能按预期工作。
类定义:
@Entity
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonPropertyOrder({ "name", "imageLink", "weeklyGross", "weeklyChange" })
public class WeeklyBoxOffice {
@Embeddable
public static class WeeklyBoxOfficeID implements Serializable {
public String country;
public String name;
public WeeklyBoxOfficeID() {
}
}
public WeeklyBoxOffice() {
this.id = new WeeklyBoxOfficeID();
}
@EmbeddedId
@JsonUnwrapped
WeeklyBoxOfficeID id;
private long weeklyGross;
private double weeklyChange;
// "weeklyGross":"$294,710"
public void setWeeklyGross(String weeklyGross) throws ParseException {
System.out.println("setWeeklyGross called, weeklyGross = " + weeklyGross);
this.weeklyGross = (long) NumberFormat.getCurrencyInstance(Locale.US)
.parse(weeklyGross);
}
// "weeklyChange": "-57.1%"
public void setWeeklyChange(String weeklyChange) {
this.weeklyChange = weeklyChange.equals("-") ? 0 : Double.parseDouble(weeklyChange.replace('%', ' '));
}
public void setCountry(String country) {
this.id.country = country;
}
// @JsonProperty("name")
public void setName(String name) {
System.out.println("Set name caled, name = " + name);
this.id.name = name;
}
public void setMovie(Movie movie) {
this.movie = movie;
}
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"TrendingMovies\": [\n" +
" {\n" +
" \"name\": \"The Dark Tower\",\n" +
" \"weeklyGross\": \"$461,377\",\n" +
" \"weeklyChange\": \"5.0\"\n" +
" }\n" +
" ]\n" +
"}\n";
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
List<WeeklyBoxOffice> list = mapper.readValue(mapper.readTree(json).get("TrendingMovies").toString(), new TypeReference<List<WeeklyBoxOffice>>() {});
list.forEach(System.out::println);
}
输出:
设置名称caled,名称=黑暗之塔
问题是@jsonunwrapped
,如果您删除它,它就可以正常工作。如果您使用调试器跟踪代码,您将看到Jackson(按以下顺序):
WeeklyBoxOffice
构造函数,该构造函数将WeeklyBoxOfficeID
设置为空对象(全部为空)。setname
并在WeeklyBoxOfficeID ID
中设置名称。name
字段,因为getname
以前使用过它。因此它现在将其设置为NULL。如果保留@jsonunwrapped
但删除setCountry
和setName
设置器,那么代码也可以工作,这可能更简单。基本上用一个或另一个。
我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"
我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 嵌套对象,例如: 字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。
问题内容: 有人可以提供一个示例或参考,该示例或参考提供一种使用Jackson库将嵌套JAVA对象转换为JSON输出的方法的方法。我没有转换平面JAVA对象的问题。但是,JSON库显示嵌套的对象名称和类型,而不是其子对象。我几乎可以利用此处提供的相同代码http://www.mkyong.com/java/jackson-2-convert- java-object-to-from-json/ 。
我有以下课程: 问题是我只能修改类。
问题内容: 这是我的文档架构。是嵌套对象。我需要更新/删除其中的特定文件。我能够使用groovy脚本更新字段。 但是不知道如何更新嵌套对象。 例如,我想将此添加到中。 并且我的文档应更改为: 如果我基于= 122 执行删除,则我的记录应如下所示 问题答案: 要将新元素添加到嵌套字段,您可以像这样进行操作: 要从嵌套字段列表中删除现有元素,可以按以下步骤进行:
情境:很少有应用程序使用Java DTO进行通信。我有一个类,它作为字段持有另一个类,它们持有另一个类(从顶部DTO到下面三个级别)。 字段可以是单个DTO或作为其他类(DTO)的ArrayList(排他)。所有类都是DTO。只有私有字段和公共setter和getter。 现在,当我得到top DTO时,有没有办法检查它并获得所有getter,包括嵌套的getter,通过getter,读取字段,然