类注解

Properties(属性处理)

Rename(属性重命名)

public class Name {
  @JsonProperty("firstName")
  public String _first_name;
}

在将 Name 实体类转化为 JSON 的时候,就会变成:

{ "firstName": "Bob" }

Ignore(属性忽略)

public class Value {
  public int value;

  @JsonIgnore
  public int internalValue;
}

最终生成的 JSON 是如下格式:

{ "value": 42 }

也可以在类的头部统一声明:

@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
  public int value;
}

那么如下的 JSON 字符串也是可以被转化为该实体类的:

{ "value": 42, "extra": "fluffy", "uselessValue": -13 }

对于意外地未知属性,也可以统一忽略:

@JsonIgnoreProperties(ignoreUnknown = true)
public class PojoWithAny {
  public int value;
}

@JsonView(动态控制展示的成员变量)

首先定义一个简单的 View 控制类:

public class Views {

  public static class Normal {}

  public static class Manager extends Normal {}


}

在下面的代码实现中,如果是选择了 Normal View,那么 salary 属性将会被隐藏,而在 Manager View 状态下,任何属性都会被展示。

public class Staff {

	@JsonView(Views.Normal.class)
	private String name;

	@JsonView(Views.Normal.class)
	private int age;

	@JsonView(Views.Normal.class)
	private String position;

	@JsonView(Views.Manager.class)
	private BigDecimal salary;

	@JsonView(Views.Normal.class)
	private List<String> skills;

在进行 Object 转化为 JSON 的过程中,进行视图控制:

public class Jackson2Example {

  public static void main(String[] args) {
    Jackson2Example obj = new Jackson2Example();
    obj.run();
  }

  private void run() {
    ObjectMapper mapper = new ObjectMapper();

    Staff staff = createDummyObject();

    try {
      // Salary will be hidden
      System.out.println("Normal View");
      String normalView = mapper
        .writerWithView(Views.Normal.class)
        .writeValueAsString(staff);
      System.out.println(normalView);

      String jsonInString =
        "{\"name\":\"mkyong\",\"age\":33,\"position\":\"Developer\",\"salary\":7500,\"skills\":[\"java\",\"python\"]}";
      Staff normalStaff = mapper
        .readerWithView(Views.Normal.class)
        .forType(Staff.class)
        .readValue(jsonInString);
      System.out.println(normalStaff);

      // Display everything
      System.out.println("\nManager View");
      String managerView = mapper
        .writerWithView(Views.Manager.class)
        .writeValueAsString(staff);
      System.out.println(managerView);

      Staff managerStaff = mapper
        .readerWithView(Views.Manager.class)
        .forType(Staff.class)
        .readValue(jsonInString);
      System.out.println(managerStaff);
    } catch (JsonGenerationException e) {
      e.printStackTrace();
    } catch (JsonMappingException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  private Staff createDummyObject() {
    Staff staff = new Staff();

    staff.setName("mkyong");
    staff.setAge(33);
    staff.setPosition("Developer");
    staff.setSalary(new BigDecimal("7500"));

    List<String> skills = new ArrayList<>();
    skills.add("java");
    skills.add("python");

    staff.setSkills(skills);

    return staff;
  }
}

最终输出的结果为:

Normal View
{"name":"mkyong","age":33,"position":"Developer","skills":["java","python"]}
Staff [name=mkyong, age=33, position=Developer, salary=null, skills=[java, python]]

Manager View
{"name":"mkyong","age":33,"position":"Developer","salary":7500,"skills":["java","python"]}
Staff [name=mkyong, age=33, position=Developer, salary=7500, skills=[java, python]]
上一页