【问题标题】:Jackson @JsonIgnoreProperties isn't working on referenced class property?Jackson @JsonIgnoreProperties 没有处理引用的类属性?
【发布时间】:2020-09-04 20:47:34
【问题描述】:

我正在尝试创建一个模型 (Request) 类,它会忽略它引用的嵌套类的属性。我被告知我不能以任何方式修改引用模型 (User),所以我尝试的是从 Request 模型中忽略它的属性。

@Data
@Builder
public class Request {
  @JsonIgnoreProperties(value = {"id"})
  User user;
}

// class I cannot modify
@Data
@Builder
public class User {
  String id;
  String name;
  ...
}

在有效负载中,我仍然看到 id 序列化和反序列化,因此注释显然不起作用。如果我将它放在User 的类级别上似乎可以正常工作,但由于我无法修改User,我也尝试过:

@JsonIgnoreProperties(value = {"user.id"})
public class Request {
  User user;

以上都不起作用。医生说

从 2.0 开始,这个注解既可以应用于类也可以应用于属性

我在 Spring Boot 项目中使用 Jackson 2.10.2。我错过了什么?

【问题讨论】:

  • 你对你的例子没问题,我正在运行同样的,它可以工作,你能在 ObjectMapper mapper= new ObjectMapper();mapper.writeValueAsString(object) 的主要方法中尝试一个本地例子
  • @MarcoPens 我做了Request request = mapper.readValue("{\"user\":{\"id\": \"a\", \"name\":\"b\"}}", Request.class);id 仍在反序列化。

标签: java spring jackson


【解决方案1】:

创建一个扩展 User 的类,如下所示:

public class MyUser extends User {
    @JsonIgnore           
    String id;     
}

@Data
@Builder
public class Request {
  MyUser user;
}

【讨论】:

  • 我希望。但实际模型要大得多,不想复制整个类。
【解决方案2】:

我正在运行这个测试并且工作正常:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Request {
    @JsonIgnoreProperties("id")
    User user;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {

    String id;
    String name;

}



public class TestClass {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper= new ObjectMapper();

        final Request value = Request.builder()
            .user(User.builder()
                .id("qw423432")
                .name("asdasdjsadjasdasd")
                .build())
            .build();
        System.out.println(mapper.writeValueAsString(value));

        System.out.println(mapper.readValue("{\"user\":{\"id\": \"a\", \"name\":\"b\"}}", Request.class));
    }

}

你觉得你的测试有什么不同吗?

【讨论】:

  • 你的System.out.println(mapper.readValue("{\"user\":{\"id\": \"a\", \"name\":\"b\"}}", Request.class)); 打印什么?
  • 它打印出这个Request(user=User(id=null, name=b)),这是您正在寻找的响应吗?
  • 我的照片Request(user=User(id=a, name=b)) ...lol
  • 您是否仔细检查过您是否在同一 2.10.2 版本中使用 jackson-databindjackson-core
  • 我刚刚使用jackson 2.9.7 对其进行了测试,得到的结果与@Marco Pens 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多