当前位置: 首页 > 知识库问答 >
问题:

Jackson调用setter但嵌套对象的字段仍为空

姜钊
2023-03-14

有一个类内部有另一个静态类。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,名称=黑暗之塔

共有1个答案

锺离高丽
2023-03-14

问题是@jsonunwrapped,如果您删除它,它就可以正常工作。如果您使用调试器跟踪代码,您将看到Jackson(按以下顺序):

  1. 调用WeeklyBoxOffice构造函数,该构造函数将WeeklyBoxOfficeID设置为空对象(全部为空)。
  2. 通过匹配名称为每个JSON字段调用setter。调用setname并在WeeklyBoxOfficeID ID中设置名称。
  3. 处理任何注释为未包装的字段。它在JSON中找不到name字段,因为getname以前使用过它。因此它现在将其设置为NULL。

如果保留@jsonunwrapped但删除setCountrysetName设置器,那么代码也可以工作,这可能更简单。基本上用一个或另一个。

 类似资料:
  • 我对对象接口的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,读取字段,然