Java基础篇--JSON

目录

概述

JSON的形式

JSON作为一个字符串:

JSON作为一组键值对:

JSON解析为Java对象:

常用方法

几种常用JSON库

Gson(还可以)

FastJson(推荐)

Jackson(推荐)

Json-lib(了解既可)

四个库的maven依赖

JSON序列化

JSON反序列化

序列化方法处理流程


概述

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,采用的是键值对的方式,包含对象(或者叫记录、结构、字典、哈希表、有键列表或关联数组等)和数组两种结构。

它的语法规则也比较简单:

  1. 数据都包含在一个名称/值对中,
  2. 数据之间用逗号分隔,
  3. 对象用大括号保存,
  4. 数组用中括号保存。

JSON的这种简单易懂的格式使得它成为了不同语言之间进行数据交换的常用格式,因为大部分现代编程语言都支持键值对的无序集合(对象)值的有序列表(数组)这两种常见的数据结构。

除了语法规则简单,JSON还有其他的优点,比如易于人类阅读和编写,也易于机器解析和生成。这使得JSON成为了一种理想的数据交换语言,被广泛应用于Web服务和API。

JSON的形式

在Java中,JSON通常表示为字符串或者一组键值对。如果JSON是一个字符串,那么它需要被解析成Java对象才能使用。如果JSON是一组键值对,那么它可以直接在Java中使用。

JSON作为一个字符串:

String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";

这个字符串包含了JSON数据。要使用这个数据,我们需要将其解析为一个Java对象。 

JSON作为一组键值对:

Map<String, Object> jsonObject = new HashMap<>();  
jsonObject.put("name", "John");  
jsonObject.put("age", 30);  
jsonObject.put("city", "New York");

这个Map对象包含了同样的JSON数据,但它是在Java中直接使用的。

JSON解析为Java对象:

如果JSON字符串包含了复杂的数据结构,比如数组或者嵌套的对象,那么解析JSON字符串为Java对象会更有用。我们可以使用诸如Jackson或Gson这样的库来将JSON字符串解析为Java对象。

例如,如果我们有一个JSON字符串表示一个用户,如下所示:

String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\", \"friends\":[\"Jane\", \"Tom\"]}";

我们可以创建一个对应的Java类来表示这个用户:

public class User {  
    private String name;  
    private int age;  
    private String city;  
    private List<String> friends;  
    // getters and setters  
}

然后我们可以使用Jackson或Gson库将JSON字符串解析为User对象:

User user = objectMapper.readValue(jsonString, User.class); // 使用Jackson库  
User user = gson.fromJson(jsonString, User.class); // 使用Gson库

这样,我们就可以在Java中使用这个User对象了。 

具体参见:JSON官网

常用方法

在Java中处理JSON数据时,我们经常用到以下常用方法:

  1. JSON.parse(): 将一个JSON字符串转换为Java对象。例如,JSON.parse(jsonString)。
  2. JSON.stringify(): 将一个JavaScript对象转换为JSON字符串。例如,JSON.stringify(jsonObject)。
  3. JSONObject: 这是在处理JSON数据时最常见的类。使用此类,可以创建、解析和操作JSON对象。例如,new JSONObject(jsonString),new JSONObject().put("key", "value")等。
  4. JSONArray: 这是用于处理JSON数组的类。例如,new JSONArray(jsonString),new JSONArray().put("element1").put("element2")等。
  5. has(): 用于检查JSON对象是否包含特定的键。例如,jsonObject.has("key")。
  6. get(): 用于获取JSON对象中特定键的值。例如,jsonObject.get("key")。
  7. opt(): 与get()类似,但该方法返回指定属性的默认值,如果该属性不存在,则返回null。例如,jsonObject.opt("key")。
  8. put(): 用于向JSON对象中添加新的键-值对。例如,jsonObject.put("key", value)。
  9. remove(): 从JSON对象中删除指定键-值对。例如,jsonObject.remove("key")。
  10. toString(): 将JSON对象转换为字符串。例如,jsonObject.toString()。

Java中处理JSON的常用方法有以下几种:

  1. 使用第三方库:最常用的方法是使用第三方JSON处理库,如Jackson、Gson和JSON.simple。这些库提供了简单易用的API,可以方便地将Java对象转换为JSON字符串,以及将JSON字符串解析为Java对象。
  2. 使用Java内置类:Java 8及以上版本提供了javax.json包,其中包含了一些用于处理JSON的内置类,如JsonObject、JsonArray和JsonParser等。这些类提供了基本的JSON解析和生成功能,适用于简单的JSON处理需求。
  3. 手动解析JSON:对于一些较为复杂的JSON结构,也可以手动解析JSON字符串。通过使用字符串操作方法,如split()、substring()和正则表达式等,可以逐层解析JSON字符串,并将其转换为Java对象或其他数据结构。

几种常用JSON库

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也方便机器解析和生成。它基于ECMAScript的一个子集,用于存储和交换文本信息。

在Java中处理JSON,我们通常使用库来简化工作。常用的库包括:Gson,FastJson,Jackson,Json-lib。

Gson(还可以)

项目地址:GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

Gson是Google开发的一个开源JSON库,它是一个非常强大的JSON解析库,功能齐全,使用简单,适用于处理大型和复杂的JSON数据。除了toJsonfromJson两个转换函数之外,Gson还提供了许多其他功能,例如自定义序列化和反序列化规则、注解支持等。Gson的优点之一是它具有良好的性能,尽管在某些情况下可能不如其他一些JSON库。此外,Gson的API简单易用,易于上手和使用。它还具有良好的可扩展性,可以通过自定义规则来扩展其功能。

在使用Gson之前,需要先创建对象的类型以及其成员。只要类中有get和set方法,Gson就可以实现复杂类型的json到bean或bean到json的转换。这使得Gson成为JSON解析的神器,被许多公司和用户广泛应用。

总之,Gson是一个功能齐全、使用简单、性能良好且可扩展的Java JSON库,适用于处理大型和复杂的JSON数据。

FastJson(推荐)

项目地址:GitHub - alibaba/fastjson: FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.

Fastjson是一个非常高效的JSON处理库,由阿里巴巴开发并维护。它的设计目标是提供超高的性能以及简单易用的API。Fastjson是用Java编写的,因此它可以无缝地集成到Java项目中。它不需要任何外部的依赖,可以直接运行在任何支持Java的平台上。

Fastjson对于复杂类型的Java Bean转换为JSON的时候有一些问题。这是因为Java的对象模型和JSON的数据模型在表达数据方面有一些不同。在处理复杂类型的Java Bean时,可能会出现一些引用的问题。例如,如果两个Java对象互相引用,那么在转换为JSON时可能会出现问题,因为JSON不支持循环引用。

Fastjson提供了一种解决方案来处理这种问题,那就是使用@Reference注解。通过这个注解,你可以明确指定哪些对象是相互引用的,这样Fastjson就能够正确地处理这些引用。

Fastjson的性能确实非常出色。它使用了独创的算法来优化解析和生成JSON的速度,这使得它在速度上超过了其他所有的JSON库。这使得Fastjson在需要处理大量JSON数据的场景中特别有用。

总的来说,Fastjson是一个非常强大且高效的JSON处理库,适用于需要处理大量JSON数据的Java项目。虽然它对于复杂类型的Java Bean转换可能会有些问题,但是通过使用@Reference注解或者其他解决方案,这些问题可以得到解决。

Jackson(推荐)

项目地址:https://github.com/FasterXML/jackson

Jackson是一个广泛使用的Java开源框架,用于序列化和反序列化JSON。它的社区非常活跃,更新速度也很快。 从Github中的统计来看,Jackson能够成为最流行的JSON解析器之一,Spring MVC的默认json解析器便是Jackson,这归功于它的诸多优点和灵活的API。

以下是Jackson的优点:

  1. Jackson所依赖的jar包较少,简单易用。这使得它在项目的配置和构建过程中相对容易集成。
  2. 与其他Java的JSON框架(如Gson等)相比,Jackson解析大的JSON文件速度比较快。这使得它在处理大型JSON数据时具有更高的性能。
  3. Jackson运行时占用内存比较低,性能比较好。这使得它在处理大量数据时能更有效地利用系统资源。
  4. Jackson有灵活的API,可以很容易进行扩展和定制。这使得开发者可以根据项目的特定需求对Jackson进行定制化配置。

Jackson核心模块包括:

  1. Jackson-core核心包:提供基于“流模式”解析的相关API,包括JsonPaser和JsonGenerator。Jackson内部实现正是通过高性能的流模式API的JsonGenerator和JsonParser来生成和解析json。
  2. Jackson-annotations注解包:提供标准注解功能。
  3. Jackson-databind数据绑定包:提供基于”对象绑定”解析的相关API(ObjectMapper)和”树模型”解析的相关API(JsonNode);基于”对象绑定”解析的API和”树模型”解析的API和依赖基于”流模式”解析的API。

这些模块使得Jackson具有强大的功能和灵活性,能够满足各种不同的JSON处理需求。

Json-lib(了解既可)

项目地址:Maven - Json-lib::Welcome

Json-lib最开始的也是应用最广泛的json解析工具。然而,它有一些缺点:

  1. 依赖于多个第三方包:Json-lib依赖于多个第三方库,这可能会导致项目的依赖管理变得复杂。
  2. 转换缺陷:当将JSON转换为Java对象时,Json-lib可能会出现问题。例如,如果一个类中包含另一个类的列表或映射,从JSON到Java对象的转换就会出现问题。
  3. 功能和性能不足:随着互联网技术的发展和需求的不断增长,对JSON解析工具的要求也越来越高。因此,Json-lib在功能和性能方面无法满足现代应用程序的需求。

四个库的maven依赖

<!-- json-lib -->  
<dependency>  
    <groupId>net.sf.json-lib</groupId>  
    <artifactId>json-lib</artifactId>  
    <version>最新的版本号</version>  
    <classifier>jdk15</classifier>  
</dependency>  
  
<!-- gson -->  
<dependency>  
    <groupId>com.google.code.gson</groupId>  
    <artifactId>gson</artifactId>  
    <version>最新的版本号</version>  
</dependency>  
  
<!-- fastjson -->  
<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>fastjson</artifactId>  
    <version>最新的版本号</version>  
</dependency>  
  
<!-- jackson -->  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-databind</artifactId>  
    <version>最新的版本号</version>  
</dependency>  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-annotations</artifactId>  
    <version>最新的版本号</version>  
</dependency>

注意:将上述代码中的"最新的版本号"替换为所要使用的最新版本号。 

JSON序列化

Java的JSON序列化是将Java对象转换成JSON格式的过程。在Java中,有许多库可以用来进行JSON序列化,例如Jackson、Gson和Fastjson等。

以下是一个使用Jackson库进行JSON序列化的示例:

import com.fasterxml.jackson.databind.ObjectMapper;  
  
public class Example {  
    public static void main(String[] args) throws Exception {  
        ObjectMapper objectMapper = new ObjectMapper();  
        Person person = new Person("John", 30);  
        String json = objectMapper.writeValueAsString(person);  
        System.out.println(json);  
    }  
}  
  
class Person {  
    private String name;  
    private int age;  
  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
}

在这个示例中,我们使用ObjectMapper将Person对象转换成JSON字符串。在调用writeValueAsString()方法时,ObjectMapper会自动遍历Person对象的所有字段,并将它们转换成JSON格式。

以下是使用FastJson库进行JSON序列化的示例:

import com.alibaba.fastjson.JSON;  
  
public class Example {  
    public static void main(String[] args) {  
        Person person = new Person("John", 30);  
        String json = JSON.toJSONString(person);  
        System.out.println(json);  
    }  
}  
  
class Person {  
    private String name;  
    private int age;  
  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
}

在这个示例中,我们使用FastJson的JSON类将Person对象转换成JSON字符串。调用toJSONString()方法时,FastJson会自动遍历Person对象的所有字段,并将它们转换成JSON格式。 输出的JSON字符串类似于:

{"name":"John","age":30}

JSON反序列化

JSON反序列化是将JSON格式的数据转换成Java对象的过程。在Java中,有许多库可以用来进行JSON反序列化,例如Jackson、Gson和Fastjson等。

以下是一个使用Jackson库进行JSON反序列化的示例:

import com.fasterxml.jackson.databind.ObjectMapper;  
  
public class Example {  
    public static void main(String[] args) throws Exception {  
        String json = "{\"name\":\"John\",\"age\":30}";  
        ObjectMapper objectMapper = new ObjectMapper();  
        Person person = objectMapper.readValue(json, Person.class);  
        System.out.println(person.getName());  
        System.out.println(person.getAge());  
    }  
}  
  
class Person {  
    private String name;  
    private int age;  
  
    public String getName() {  
        return name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
}

在这个示例中,我们使用ObjectMapper将JSON字符串转换成Person对象。在调用readValue()方法时,ObjectMapper会自动将JSON字符串解析成Java对象。

以下是使用FastJson库进行JSON反序列化的示例:

import com.alibaba.fastjson.JSON;  
  
public class Example {  
    public static void main(String[] args) {  
        String json = "{\"name\":\"John\",\"age\":30}";  
        Person person = JSON.parseObject(json, Person.class);  
        System.out.println(person.getName());  
        System.out.println(person.getAge());  
    }  
}  
  
class Person {  
    private String name;  
    private int age;  
  
    public String getName() {  
        return name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
}

在这个示例中,我们使用FastJson的JSON类将JSON字符串转换成Person对象。调用parseObject()方法时,FastJson会自动将JSON字符串解析成Java对象。输出的结果类似于:

John  
30

序列化方法处理流程

​​​​​​​序列化:把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。
反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。

基本流程为:

  1. 构建参数类型对象:首先,需要构建通用序列化基础方法所需要的参数类型对象。这些对象将用于指定要序列化的类的字段和属性。
  2. 分析序列化类型:接下来,需要对序列化类型进行分析。这可以通过注解或"get方法名(比如getXxx,isXxx)"等方式来完成。根据分析结果,可以确定需要序列化的类的属性。
  3. 反射机制处理属性:通过反射机制,可以获取到类的所有属性,并针对每个属性进行处理。对于每个属性,需要获取其对应的值,并调用相应的getter方法(如果有的话)来获取属性的值。
  4. 拼接字符串:在获取到所有属性的值之后,需要将这些值拼接成一个字符串。这个过程中,会根据属性的类型写入一些开始和结束符号,例如"{"和"}"。然后,将步骤3中解析得到的设值信息嵌入到这些符号之间。
  5. 返回最终的字符串内容:完成字符串拼接后,序列化方法将返回最终的字符串内容。这个字符串就是对象的序列化表示,可以将其存储到磁盘或进行网络传输。

在反序列化的过程中,首先需要将字节序列解析为对象的状态信息,然后通过反序列化工具类将其恢复为对象。

这个过程就是序列化和反序列化的基本流程。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老李头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值