JavaRush /Java 博客 /Random-ZH /Jackson框架简介
Mikhail Fufaev
第 35 级
Москва

Jackson框架简介

已在 Random-ZH 群组中发布
在一个寒冷的春夜,我终于达到了33级。摩挲着我的程序员双手,我已经准备好拥抱 JSON 序列化和反序列化的整个领域了,但不幸的是,我什么都不懂。我不记得讲座的内容,但问题凭直觉就得到了解决。在这方面,我决定深入研究 Jackson 框架并弄清楚这个 JSON 是什么。
杰克逊框架
我将尝试以备忘单的形式以实用且简洁的方式展示我的所有知识(无论是为我自己还是为读者)。 杰克逊注释之旅。 我们在 JSON 过程中遇到的第一件事就是 @JsonAutoDetect 注释。乍一看,这是一个简单的总结,但作者却花了最长的时间才弄清楚。摘要中有我们需要的 5 个方法:
  • fieldVisibility () - 仅序列化具有指定访问修饰符的字段
  • getterVisibility()/setterVisibility() - 序列化其 getter/setter 具有指定访问修饰符的字段
  • isGetterVisibility() - 布尔 getter 的单独实现
重要的是要理解这些方法是分离工作的。那些。如果该字段至少与注释中指定的参数之一匹配,则它将包含在 JSON 中。尝试回答如果我们使用无参数构造函数创建实例,此代码将输出什么:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        getterVisibility        = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        setterVisibility        = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        isGetterVisibility      = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
    public String name;
    private Map<String, String> properties;
    public Queue<String> queue;
    protected List<String> list;
    private int age;
    private int number;
    private boolean isHead;

    protected HeadClass(int age) {
        this.age = age;
    }

    public HeadClass() {}

    Map<String, String> getProperties() {
        return properties;
    }

    protected boolean isHead() {
        return isHead;
    }

    protected void setProperties(Map<String, String> properties) {
        this.properties = properties;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}
如果我们删除 isGetterVisibility 会怎样?列出的四种方法配置了序列化过程。第五个依次规范反序列化过程:
  • CreatorVisibility()是最难理解的方法。它与构造函数和工厂方法(调用时创建对象的方法)一起使用。让我们看一个例子:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
    public String name;
    public int id;

    HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
        this.name = name;
        this.id = id;
    }

    protected HeadClass(String name) {
        this.name = name;
        this.id = 123;
    }

    protected HeadClass(int id) {
        this.id = id;
        this.name = "Yes!";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
    StringReader reader = new StringReader(forDeserialize);

    HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
关于反序列化机制的重要说明!当我们尝试从 JSON 创建对象时,将使用与 JSON 对象中相同的参数集来搜索所需类的构造函数。在上面的示例中,我们的 JSON 对象包含两个参数:name、id。猜猜它将调用哪个构造函数。是的,如果我们编译这段代码,它会抛出一个错误,为什么呢?因为我们限制了构造函数的可见性(只有带有 protected、public 修饰符的构造函数才可见)。如果您删除 CreatorVisibility 它将起作用。问题出现了。构造函数中的@JsonProperty是什么?我想我会在文章的下一部分讨论这个问题。 PS先生们,我真的很想至少得到一些关于这篇文章的回应。我想知道这个话题是否有需求,是否值得继续下去,因为话题很多,而且都很有趣。我还想考虑 @JsonView、@JsonManagedReference、@JsonBackReference、@JsonUnwrapped 等注释。谢谢 :)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION