【问题标题】:Jackson exlude extended class杰克逊排除扩展类
【发布时间】:2020-09-24 18:55:25
【问题描述】:

我有课:

public class User implements Body {

    private Integer userId;
    private String userName;
    private String emailId;

    //getter and setter

}

我想用 Jackson 映射器排除 Body 类,因为我收到错误

 ObjectMapper mapper = new ObjectMapper();
 User user = new User;
 String jsonString = mapper.writeValueAsString(user);

如何在排除所有扩展类或实现类的情况下将对象转换为 JSON?我只需要转换没有 Body 的 User 类

我的超类有很多这样的公共方法:

public final Enumeration method(String email) {
            throw new RuntimeException("Error");
        }
    

    public final Object method(String name) {
        throw new RuntimeException("Error");
    }

【问题讨论】:

  • 你能修改 Body 类吗?
  • 不,我不能修改 Body 类

标签: java json jackson


【解决方案1】:

只需注释您正在序列化的类并列出要排除的属性。

@JsonIgnoreProperties({"bodyPropertyA", "bodyPropertyB", "bodyPropertyC"})
public class User implements Body {

    private Integer userId;
    private String userName;
    private String emailId;
}

【讨论】:

  • 另一种编辑 ObjectMapper 的方法(不建议)
  • 我有数百个对象我无法使用此方法。我需要另一种方式,例如排除一个类,因为我的所有对象都扩展了一个类
【解决方案2】:

尝试添加过滤器以排除父字段。这是一个测试:

public class JacksonTest {
  @Test
  public void excludeParent() throws JsonProcessingException {
  ObjectMapper objectMapper= new ObjectMapper();
    SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
      .serializeAllExcept("name","phone");
    FilterProvider filters = new SimpleFilterProvider()
      .addFilter("filterPerson", theFilter);
    objectMapper.setFilterProvider(filters);
    final User user = new User("email1",12);
    user.setName("personName");
    user.setPhone("12345");
    System.out.println(objectMapper.writeValueAsString(user));
  }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonFilter("filterPerson")
class User extends Person{
  String email;
  int age;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Person{
  String name;
  String phone;
}

控制台:

{"email":"email1","age":12}

【讨论】:

  • 我得到了 JsonMappingException 我想是因为我扩展的不是 POJO 类,所以我需要避免所有类 -
【解决方案3】:

试试这个:

@JsonIgnore
public interface HiddenBody extends Body {
}

public class User implements HiddenBody {
    //
}

Liskov Substitution Principle 表示一切仍应编译并执行正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2016-02-19
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多