• 首页
  • 粮食
  • 蔬菜
  • 果品
  • 水产
  • 酒水
  • 饮料
  • 茶叶
  • 畜禽
  • 食用油
  • 资讯
logo
  • 首页>
  • 水产 >
  • 正文

热议:从Java到JSON:探索Jackson的魔力

2023-07-04 09:59:02 来源:程序猿阿嘴

Jackson是一个用于处理JSON数据的开源Java库。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于计算机解析和生成。在Java领域,Jackson已经成为处理JSON数据的事实标准库。它提供了丰富的功能,包括将Java对象转换为JSON字符串(序列化)以及将JSON字符串转换为Java对象(反序列化)。

Jackson主要由三个核心包组成:


(资料图片仅供参考)

jackson-databind:提供了通用的数据绑定功能(将Java对象与JSON数据相互转换) jackson-core:提供了核心的低级JSON处理API(例如JsonParser和JsonGenerator) jackson-annotations:提供了用于配置数据绑定的注解

尽管Java生态系统中有其他处理JSON数据的库(如Gson和JSON-java),但Jackson仍然是许多开发者的首选,原因包括:

性能:Jackson性能优越,对内存和CPU的使用都相对较低。许多性能基准测试表明,Jackson在序列化和反序列化方面都比其他库更快。 功能丰富:Jackson提供了许多功能,包括注解、自定义序列化和反序列化、动态解析等,使其非常灵活和强大。 易于使用:Jackson的API简单易用,使得开发者可以轻松地在他们的应用程序中集成和使用。 社区支持:Jackson拥有庞大的开发者社区,这意味着有更多的文档、教程和问题解答可供参考。 模块化:Jackson支持通过模块扩展其功能,例如Java 8时间库、Joda-Time和Kotlin等。 兼容性:Jackson可以很好地与其他流行的Java框架(如Spring)集成。

综上所述,Jackson是一个强大且易于使用的库,值得Java开发者在处理JSON数据时使用。

Jackson库的核心功能是将Java对象转换为JSON字符串(序列化)以及将JSON字符串转换为Java对象(反序列化)。下面是这两个功能的详细介绍:

序列化是将Java对象转换为JSON字符串的过程。这在许多场景中非常有用,例如在将数据发送到Web客户端时,或者在将数据存储到文件或数据库时。Jackson通过ObjectMapper类来实现序列化。以下是一个简单的示例:

java复制代码import ;public class Person {    public String name;    public int age;    public Person(String name, int age) {         = name;         = age;    }    public static void main(String[] args) {        ObjectMapper objectMapper = new ObjectMapper();        Person person = new Person("Alice", 30);        try {            String jsonString = (person);            (jsonString); // 输出:{"name":"Alice","age":30}        } catch (Exception e) {            ();        }    }}

反序列化是将JSON字符串转换回Java对象的过程。这在从Web客户端接收数据或从文件或数据库读取数据时非常有用。同样,Jackson使用ObjectMapper类来实现反序列化。以下是一个简单的示例:

java复制代码import ;public class Person {    public String name;    public int age;    public Person() {    }    public static void main(String[] args) {        ObjectMapper objectMapper = new ObjectMapper();        String jsonString = "{\"name\":\"Alice\",\"age\":30}";        try {            Person person = (jsonString, );            ("Name: " +  + ", Age: " + ); // 输出:Name: Alice, Age: 30        } catch (Exception e) {            ();        }    }}

这些示例展示了Jackson库的基本功能。接下来的部分将介绍如何使用Jackson库,包括添加依赖、创建Java对象模型以及使用ObjectMapper进行序列化和反序列化。

由于Jackson库的API非常多,这里无法一一详细介绍。我将为你提供一些主要的API和组件概览,以便于你更好地了解Jackson库。具体实现和使用方法,你可以参考官方文档和相关教程。

以下是Jackson库的一些主要API和组件:

ObjectMapper :这是Jackson库的核心类,用于序列化和反序列化操作。主要方法有: writeValueAsString(Object):将Java对象序列化为JSON字符串。 readValue(String, Class):将JSON字符串反序列化为Java对象。 JsonParser :用于从JSON数据源(如文件、输入流或字符串)解析JSON数据。主要方法有: nextToken():获取下一个JSON令牌(如START_OBJECT、FIELD_NAME等)。 getValueAsString():将当前令牌作为字符串返回。 getValueAsInt():将当前令牌作为整数返回。 JsonGenerator :用于将JSON数据写入数据源(如文件、输出流或字符串缓冲区)。主要方法有: writeStartObject():写入开始对象标记({)。 writeFieldName(String):写入字段名称。 writeString(String):写入字符串值。 writeEndObject():写入结束对象标记(})。 JsonNode :用于表示JSON树模型中的节点,可以是对象、数组、字符串、数字等。主要方法有: get(String):获取指定字段的子节点。 path(String):获取指定字段的子节点,如果不存在则返回一个“missing”节点。 isObject():检查当前节点是否是一个对象。 isArray():检查当前节点是否是一个数组。 注解 :Jackson提供了一系列注解来配置序列化和反序列化过程。一些常用注解包括: @JsonProperty:指定字段在JSON数据中的名称。 @JsonIgnore:指定字段在序列化和反序列化过程中被忽略。 @JsonCreator:指定用于反序列化的构造函数或工厂方法。 @JsonSerialize:指定用于序列化特定字段或类的自定义序列化器。 @JsonDeserialize:指定用于反序列化特定字段或类的自定义反序列化器。

这只是Jackson库API和组件的一个概览。如果你想深入了解具体的API和使用方法,请参考官方文档(/FasterXML/j… )和相关教程。同时,实际编程过程中,根据具体需求学习和了解相应的API也是非常有效的方法。

要开始使用Jackson,你需要遵循以下基本步骤:

首先,你需要将Jackson库添加到你的项目中。这可以通过Maven或Gradle来完成。以下是添加Jackson库的方法:

Maven :

将以下依赖添加到你的文件中:

xml复制代码jackson-corejackson-databindjackson-annotations

Gradle :

将以下依赖添加到你的文件中:

groovy复制代码dependencies {    implementation ":jackson-core:"    implementation ":jackson-databind:"    implementation ":jackson-annotations:"}

在使用Jackson之前,你需要创建一个Java对象模型,该模型表示你要序列化和反序列化的JSON数据。例如,以下是一个表示Person的简单Java类:

java复制代码public class Person {    private String name;    private int age;    public Person() {    }    public Person(String name, int age) {         = name;         = age;    }    public String getName() {        return name;    }    public void setName(String name) {         = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {         = age;    }}

在这个示例中,我们使用了一个简单的Java Bean(具有私有字段、公共构造函数和getter/setter方法的类)来表示Person对象。

使用ObjectMapper类,你可以轻松地将Java对象序列化为JSON字符串以及将JSON字符串反序列化为Java对象。以下是一个简单的示例:

序列化 :

java复制代码import ;public class Main {    public static void main(String[] args) {        ObjectMapper objectMapper = new ObjectMapper();        Person person = new Person("Alice", 30);        try {            String jsonString = (person);            (jsonString); // 输出:{"name":"Alice","age":30}        } catch (Exception e) {            ();        }    }}

反序列化 :

java复制代码import ;public class Main {    public static void main(String[] args) {        ObjectMapper objectMapper = new ObjectMapper();        String jsonString = "{\"name\":\"Alice\",\"age\":30}";        try {            Person person = (jsonString, );            ("Name: " + () + ", Age: " + ()); // 输出:Name: Alice, Age: 30        } catch (Exception e) {            ();        }    }}

这些示例展示了如何使用Jackson库进行序列化和反序列化操作。在实际项目中,你可能需要根据需求对这些操作进行更多的配置和自定义,例如使用注解、自定义序列化器和反序列化器等。

Jackson库提供了一系列注解,可以帮助你在序列化和反序列化过程中对字段和类进行配置。以下是一些常用注解的示例:

@JsonProperty 注解: 该注解用于指定 Java 属性与 JSON 属性之间的映射关系,常用的参数有: value:用于指定 JSON 属性的名称,当 Java 属性和 JSON 属性名称不一致时使用。 access:用于指定该属性的访问方式,常用的取值有 _ONLY(只读),_ONLY(只写)和 _WRITE(可读可写)。 java复制代码 public class Person { @JsonProperty(value = "name") private String fullName; @JsonProperty(access = _ONLY) private String password; // getters and setters } Person person = new Person(); ("John Smith"); ("123456"); ObjectMapper mapper = new ObjectMapper(); String json = (person); // {"name":"John Smith"} Person person2 = (json, ); (()); // John Smith (()); // null @JsonIgnore 注解: 该注解用于禁用 Java 属性的序列化和反序列化,常用的参数有: 无参数。 java复制代码 public class Person { private String fullName; @JsonIgnore private String password; // getters and setters } Person person = new Person(); ("John Smith"); ("123456"); ObjectMapper mapper = new ObjectMapper(); String json = (person); // {"fullName":"John Smith"} Person person2 = ("{\"fullName\":\"John Smith\",\"password\":\"123456\"}", ); (()); // John Smith (()); // null @JsonFormat 注解: 该注解用于指定 Java 属性的日期和时间格式,常用的参数有: shape:用于指定日期和时间的格式,可选的取值有 (以字符串形式表示)和 (以时间戳形式表示)。 pattern:用于指定日期和时间的格式模板,例如 "yyyy-MM-dd HH:mm:ss"。 java复制代码 public class Person { private String fullName; @JsonFormat(shape = , pattern = "yyyy-MM-dd HH:mm:ss") private Date birthDate; // getters and setters } Person person = new Person(); ("John Smith"); (new Date()); ObjectMapper mapper = new ObjectMapper(); String json = (person); // {"fullName":"John Smith","birthDate":"2022-05-16 10:38:30"} Person person2 = (json, ); (()); // John Smith (()); // Mon May 16 10:38:30 CST 2022 @JsonInclude 注解: 该注解用于指定序列化 Java 对象时包含哪些属性,常用的参数有: value:用于指定包含哪些属性,可选的取值有 (始终包含)、_NULL(值不为 null 时包含)、_DEFAULT(值不为默认值时包含)、_EMPTY(值不为空时包含)和 (自定义条件)。 content:用于指定自定义条件的实现类。 java复制代码 @JsonInclude(_NULL) public class Person { private String fullName; private Integer age; // getters and setters } Person person = new Person(); ("John Smith"); // (null); ObjectMapper mapper = new ObjectMapper(); String json = (person); // {"fullName":"John Smith"} Person person2 = ("{\"fullName\":\"John Smith\",\"age\":null}", ); (()); // John Smith (()); // null @JsonCreator 注解: 该注解用于指定反序列化时使用的构造方法或工厂方法,常用的参数有: 无参数。 java复制代码 public class Person { private String fullName; private Integer age; @JsonCreator public Person(@JsonProperty("fullName") String fullName, @JsonProperty("age") Integer age) { = fullName; = age; } // getters and setters } ObjectMapper mapper = new ObjectMapper(); Person person = ("{\"fullName\":\"John Smith\",\"age\":30}", ); (()); // John Smith (()); // 30 @JsonSetter 注解: 该注解用于指定反序列化时使用的方法,常用的参数有: value:用于指定 JSON 属性的名称,当方法名和 JSON 属性名称不一致时使用。 java复制代码 public class Person { private String fullName; private Integer age; @JsonSetter("name") public void setFullName(String fullName) { = fullName; } // getters and setters } ObjectMapper mapper = new ObjectMapper(); Person person = ("{\"name\":\"John Smith\",\"age\":30}", ); (()); // John Smith (()); // 30 @JsonGetter 注解: 该注解用于指定序列化时使用的方法,常用的参数有: value:用于指定 JSON 属性的名称,当方法名和 JSON 属性名称不一致时使用。 java复制代码 public class Person { private String fullName; private Integer age; @JsonGetter("name") public String getFullName() { return fullName; } // getters and setters } @JsonAnySetter 注解: 该注解用于指定反序列化时使用的方法,用于处理 JSON 中未知的属性,常用的参数有: 无参数。 java复制代码 public class Person { private String fullName; private MapotherProperties = new HashMap<>(); @JsonAnySetter public void setOtherProperties(String key, Object value) { (key, value); } // getters and setters } ObjectMapper mapper = new ObjectMapper(); Person person = ("{\"fullName\":\"John Smith\",\"age\":30}", ); (()); // John Smith (()); // {age=30} @JsonAnyGetter 注解: 该注解用于指定序列化时使用的方法,用于处理 Java 对象中未知的属性,常用的参数有: 无参数。 java复制代码 public class Person { private String fullName; private MapotherProperties = new HashMap<>(); public void addOtherProperty(String key, Object value) { (key, value); } @JsonAnyGetter public MapgetOtherProperties() { return otherProperties; } // getters and setters } Person person = new Person(); ("John Smith"); ("age", 30); ObjectMapper mapper = new ObjectMapper(); String json = (person); // {"fullName":"John Smith","age":30} @JsonTypeInfo 注解: 该注解用于指定 Java 对象在序列化和反序列化时的类型信息,常用的参数有: use:用于指定类型信息的使用方式,可选的取值有 (使用 Java 类的全限定名)、(使用名称)和 (不使用类型信息)。 include:用于指定类型信息的包含方式,可选的取值有 (作为 JSON 属性)和 _PROPERTY(作为外部属性)。 property:用于指定包含类型信息的属性名,当 include 的值为 时使用。 visible:用于指定类型信息是否可见。 java复制代码 @JsonTypeInfo(use = , include = , property = "type") @JsonSubTypes({ @(value = , name = "rectangle"), @(value = , name = "circle") }) public abstract class Shape { // ... } public class Rectangle extends Shape { // ... } public class Circle extends Shape { // ... } Shape shape = new Rectangle(); ObjectMapper mapper = new ObjectMapper(); String json = (shape); // {"type":"rectangle"} Shape shape2 = (json, ); (().getSimpleName()); // Rectangle

你可以创建自定义序列化器和反序列化器以自定义特定字段或类的序列化和反序列化行为。为此,请创建一个实现JsonSerializer或JsonDeserializer接口的类,并在需要自定义的字段或类上使用@JsonSerialize和@JsonDeserialize注解。例如:

java复制代码public class CustomDateSerializer extends JsonSerializer{    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");    @Override    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {        ((value));    }}
java复制代码public class Person {    private String name;    @JsonSerialize(using = )    private Date birthdate;    // ...其他代码...}

你可以使用JsonNode类来动态地解析和操作JSON数据。例如:

java复制代码String jsonString = "{\"name\":\"Alice\",\"age\":30,\"address\":{\"street\":\"Main St\",\"city\":\"New York\"}}";ObjectMapper objectMapper = new ObjectMapper();JsonNode rootNode = (jsonString);String name = ("name").asText(); // Aliceint age = ("age").asInt(); // 30String street = ("address").get("street").asText(); // Main St

Jackson可以处理Java日期和时间类型,例如和Java 8时间库中的类型。你可以通过配置ObjectMapper来指定日期和时间格式,例如:

java复制代码ObjectMapper objectMapper = new ObjectMapper();(new SimpleDateFormat("yyyy-MM-dd"));

Jackson可以处理泛型类型,例如List和Map。在反序列化时,你需要使用TypeReference来指定泛型类型。例如:

java复制代码String jsonString = "[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]";ObjectMapper objectMapper = new ObjectMapper();Listpersons = (jsonString, new TypeReference>() {});

Jackson可以通过模块来扩展其功能。例如,你可以使用jackson-datatype-jsr310模块为Jackson添加对Java 8时间库的支持。首先,将依赖添加到项目中:

Maven :

xml复制代码jackson-datatype-jsr310

Gradle :

groovy复制代码dependencies {    implementation ":jackson-datatype-jsr310:"}

然后,你需要注册模块到ObjectMapper:

java复制代码ObjectMapper objectMapper = new ObjectMapper();(new JavaTimeModule());

现在,Jackson可以正确地处理Java 8时间库中的类型,例如LocalDate、LocalTime和Instant。

优势 :

性能优异 :Jackson在序列化和反序列化过程中表现出优秀的性能,通常比其他Java JSON库更快。 灵活性 :通过注解、自定义序列化器/反序列化器等功能,Jackson提供了丰富的配置选项,允许你根据需求灵活地处理JSON数据。 易于使用 :Jackson的API设计简洁明了,易于学习和使用。同时,官方文档和社区支持也非常丰富。 可扩展性 :通过模块系统,你可以轻松地为Jackson添加新功能或与其他库进行集成。

局限性 :

库大小 :由于Jackson提供了许多功能和选项,它的库文件相对较大。在某些对程序大小有严格要求的场景中,这可能是一个问题。 学习曲线 :虽然Jackson的基本功能易于学习,但要充分利用其高级特性,可能需要一定的学习成本。 了解你的需求 :在使用Jackson之前,请确保你了解项目的需求。针对具体需求,学习和使用相应的API和特性会更加高效。 遵循Java命名规范 :使用标准的Java命名规范(如驼峰命名法)来命名字段和类。这将有助于Jackson自动处理JSON字段映射。 尽量避免循环引用 :在Java对象模型中避免循环引用,因为这可能导致序列化过程中出现问题。如果确实存在循环引用,请使用@JsonManagedReference和@JsonBackReference注解来解决。 使用注解进行配置 :在可能的情况下,使用注解来配置序列化和反序列化过程。这将使配置更加集中和易于理解。 优先使用对象模型 :尽量使用Java对象模型来表示JSON数据,而非动态解析。这将使代码更加清晰和易于维护。

除了Jackson之外,还有其他一些流行的Java JSON处理库。以下是一些常见的库:

Gson :Gson是Google开发的一个Java库,用于将Java对象转换为JSON表示以及将JSON字符串转换为等效的Java对象。Gson的API简洁易用,性能也相当不错。官方网站:/google/gson Fastjson :Fastjson是Alibaba开发的一个高性能的JSON库。Fastjson提供了灵活的API和丰富的功能,同时注重性能优化。然而,它在安全性方面存在一些问题,因此在使用时需要谨慎。官方网站:/alibaba/fas… JSON-java() :JSON-java库,也称为库,是一个非常轻量级的JSON处理库。它提供了基本的JSON编码和解码功能,但不支持对象映射等高级功能。官方网站:/stleary/JSO… Moshi :Moshi是Square公司开发的一个现代化的JSON库,具有简单易用的API和良好的性能。Moshi支持Kotlin协程,并与Kotlin编程语言非常兼容。官方网站:/square/mosh… Boon :Boon是另一个高性能的JSON处理库。它具有易用的API,支持流式处理和速度优化。然而,Boon的社区和文档相对较少。官方网站:/boonproject…

这些库各有优缺点,选择哪个库取决于项目的具体需求和团队的熟悉程度。在实际项目中,你可能需要比较这些库的性能、功能、易用性等方面的差异,以找到最适合你的解决方案。

作者:小新x 链接:/post/7231197051203092539

关键词:

    为您推荐

  • 热议:从Java到JSON:探索Jackson的魔力

    水产2023-07-04
  • 洁雅股份:公司申请的二类械字证,目前正在与省药监局预约审核时间中

    水产2023-07-04
  • 环球即时看!我大爷怎么喊我 喊“不跳不是人”的大爷是个什么人 基本情况讲解

    水产2023-07-04
  • 怎么表白男生图片_怎么表白男生|世界看点

    水产2023-07-04
  • 人形机器人热度高涨 产业链上市公司“软硬兼施”加码布局 当前看点

    水产2023-07-04
  • 莫里西曼切斯特演唱会(关于莫里西曼切斯特演唱会的简介)

    水产2023-07-04
  • 长风渡:东都之行,顾九思从深得民望到众矢之的,各方都想他死

    水产2023-07-04
  • 视点!鸡酒_关于鸡酒简述

    水产2023-07-04
  • 大骚乱!这国市长遇袭 多人被捕 外交部紧急提醒 速看

    水产2023-07-04
  • 全球热点评!贝多芬是哪国人 贝多芬内容介绍

    水产2023-07-03
  • 今日热文:暑期运输铁路客流井喷 广铁前3日发送576万人次

    水产2023-07-03
  • 当前观察:热门车讯上汽荣威E50电动车上市 售价23.49万元

    水产2023-07-03
  • 国泰君安:截至二季度末尚未换股的A股可转债金额为69.9亿元 环球资讯

    水产2023-07-03
  • 行驶质感升级/驾驶辅助更加激进 试驾体验蔚来全新ES8|聚焦

    水产2023-07-03
  • 人民币国际化的法律问题 | 央行与货币

    水产2023-07-03
  • 怎么能唱好歌_唱好歌方法

    水产2023-07-03
  • 雅诗兰黛洗面奶价格和图片_雅诗兰黛洗面奶价格 最新

    水产2023-07-03
  • 延寿特产介绍(哈尔滨延寿特产大全) 每日快讯

    水产2023-07-03
  • 威马CEO沈晖成老赖!1万4也拿不出来了,造车实体被限制消费-每日聚焦

    水产2023-07-03
  • 泰安工业推进机构完成半年“时间、任务双过半”目标要求 动态焦点

    水产2023-07-03

果品

  • 北京2022年冬奥会、冬残奥会奖牌“同心”正式发布
  • 冬奥故事会丨一图了解冬奥会历届奖牌
  • 同心筑梦向未来——写在北京冬奥会开幕倒计时100天之际
  • 外交部:美国针对亚裔仇恨犯罪数字令人痛心

蔬菜

  • 说好“一梯一户”却成了“两梯两户”,买方能否解除合同?
  • 更高水平开放合作助力中国东盟经贸发展迎新机遇
  • 9被告人犯侵犯著作权罪被判刑罚
  • 玉渊谭天丨中美再通话,“建设性”很重要
  • 环球时报社评:中美经贸需要建设性对话
  • 俄媒:莫斯科扩大新冠感染新疗法试点范围
  • 冰雪之约 中国之邀 | 追赶的勇气
  • 中国第20批赴黎维和建筑工兵分队完成“VA-2”道路排水系统修缮任务
  • 中国常驻联合国代表团举办恢复联合国合法席位50周年图片展
  • 美专家认为三大原因导致美国供应链危机

Copyright   2015-2022 北冰洋食品网 版权所有  备案号:沪ICP备2020036824号-3   联系邮箱:562 66 29@qq.com