JSON
JSON
JSON基本概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,但 JSON 是独立于语言的,许多编程语言都支持 JSON。
JSON基本结构
- JSON 数据由键值对组成,键和值之间用冒号
:分隔,键值对之间用逗号,分隔。JSON 数据有两种基本结构:- 对象(Object):用花括号
{}表示,包含一组无序的键值对。 - 数组(Array):用方括号
[]表示,包含一组有序的值。
- 对象(Object):用花括号
JSON的数据类型
- 字符串(String):用双引号
""括起来的文本。 - 数字(Number):整数或浮点数。
- 布尔值(Boolean):
true或false。 - 数组(Array):有序的值列表。
- 对象(Object):无序的键值对集合。
- null:表示空值。
JSON示例
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"postalCode": "12345"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"children": [],
"spouse": null
}
JSON解析
JavaScript中使用JSON
JavaScript中解析
-
在 JavaScript 中,可以使用
JSON.parse()方法将 JSON 字符串解析为 JavaScript 对象。 -
const jsonString = '{"name": "John Doe", "age": 30}'; const obj = JSON.parse(jsonString); console.log(obj.name); // 输出: John Doe
JavaScript生成JSON
-
在 JavaScript 中,可以使用
JSON.stringify()方法将 JavaScript 对象转换为 JSON 字符串 -
const obj = { name: "John Doe", age: 30 }; const jsonString = JSON.stringify(obj); console.log(jsonString); // 输出: {"name":"John Doe","age":30}
JAVA中使用JSON
Java解析JSON
使用 Jackson 生成和解析 JSON
-
使用 Maven,可以在
pom.xml中添加 Jackson 依赖:-
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.0</version> </dependency>
-
-
生成 JSON
-
import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个 Java 对象 Person person = new Person("John Doe", 30); // 创建 ObjectMapper 对象 ObjectMapper mapper = new ObjectMapper(); // 将 Java 对象转换为 JSON 字符串 String jsonString = mapper.writeValueAsString(person); System.out.println("生成的 JSON: " + jsonString); } } class Person { private String name; private int age; // 构造方法、getter 和 setter public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //生成的 JSON: {"name":"John Doe","age":30}
-
-
解析JSON
-
将 JSON 字符串转换为 Java 对象
-
import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // JSON 字符串 String jsonString = "{\"name\":\"John Doe\",\"age\":30}"; // 创建 ObjectMapper 对象 ObjectMapper mapper = new ObjectMapper(); // 将 JSON 字符串转换为 Java 对象 Person person = mapper.readValue(jsonString, Person.class); System.out.println("解析的 Java 对象: " + person.getName() + ", " + person.getAge()); } }
-
Jackson 的要求
- Jackson 默认通过 getter 方法 或 字段 来获取对象的属性值并生成 JSON。
- 类中的字段需要是 非私有(
public、protected或默认包访问权限),或者提供对应的 getter 方法。 - getter 方法的命名需要符合 Java Bean 规范(例如,字段
name的 getter 方法为getName())。 - 如果字段是
private且没有 getter 方法,Jackson 无法访问该字段,生成 JSON 时会忽略该字段。 - 可以通过
@JsonProperty注解显式指定字段名。
- 类中的字段需要是 非私有(
- Jackson 默认通过 setter 方法 或 字段 来设置对象的属性值。
- 类中的字段需要是 非私有,或者提供对应的 setter 方法。
- setter 方法的命名需要符合 Java Bean 规范(例如,字段
name的 setter 方法为setName(String name))。 - 如果字段是
private且没有 setter 方法,Jackson 无法设置该字段,解析 JSON 时会忽略该字段。 - 可以通过
@JsonProperty注解显式指定字段名。
使用Gson 生成和解析 JSON
-
添加依赖
-
在
pom.xml中添加 Gson 依赖: -
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
-
-
生成JSON
-
import com.google.gson.Gson; public class GsonExample { public static void main(String[] args) { // 创建一个 Java 对象 Person person = new Person("John Doe", 30); // 创建 Gson 对象 Gson gson = new Gson(); // 将 Java 对象转换为 JSON 字符串 String jsonString = gson.toJson(person); System.out.println("生成的 JSON: " + jsonString); } }
-
-
解析JSON
-
import com.google.gson.Gson; public class GsonExample { public static void main(String[] args) { // JSON 字符串 String jsonString = "{\"name\":\"John Doe\",\"age\":30}"; // 创建 Gson 对象 Gson gson = new Gson(); // 将 JSON 字符串转换为 Java 对象 Person person = gson.fromJson(jsonString, Person.class); System.out.println("解析的 Java 对象: " + person.getName() + ", " + person.getAge()); } }
-
Gson 的要求
- Gson 默认通过 字段 来获取对象的属性值并生成 JSON。
- 类中的字段需要是 非私有(
public、protected或默认包访问权限),或者提供对应的 getter 方法。 - 如果字段是
private,Gson 仍然可以通过反射访问字段值。
- 类中的字段需要是 非私有(
- Gson 默认通过 字段 来设置对象的属性值。
- 类中的字段需要是 非私有,或者提供对应的 setter 方法。
- 如果字段是
private,Gson 仍然可以通过反射设置字段值。
JSON消息规范
{
"code":"101,102,...."
"message":"业务状态码的描述信息"
"data":{
/*
返回的相关数据信息
*/
}
}
Json忽略字段方法
-
使用
@JsonIgnore注解-
@JsonIgnore是 Jackson 提供的一个注解,用于标记某个字段在序列化和反序列化时被忽略。 -
import com.fasterxml.jackson.annotation.JsonIgnore; public class User { private Long id; private String username; @JsonIgnore // 忽略该字段 private String password; // Getter和Setter方法 }
-
-
使用
@JsonIgnoreProperties注解-
@JsonIgnoreProperties是 Jackson 提供的另一个注解,可以用于类级别,指定需要忽略的字段 -
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties({"password"}) // 忽略password字段 public class User { private Long id; private String username; private String password; // Getter和Setter方法 }
-
-
使用
transient关键字transient是 Java 的关键字,用于标记字段不被序列化。Jackson 也会忽略transient字段。
-
使用
@JsonProperty注解控制字段的可见性-
@JsonProperty注解可以设置字段的访问权限。通过设置access = JsonProperty.Access.WRITE_ONLY,可以让字段只在反序列化时使用,而在序列化时忽略。 -
import com.fasterxml.jackson.annotation.JsonProperty; public class User { private Long id; private String username; @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) // 只在反序列化时使用 private String password; // Getter和Setter方法 }
-
-
使用
@JsonInclude注解忽略空值-
如果希望在序列化时忽略值为
null的字段,可以使用@JsonInclude注解。 -
import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude(JsonInclude.Include.NON_NULL) // 忽略值为null的字段 public class User { private Long id; private String username; private String password; // Getter和Setter方法 }
-

浙公网安备 33010602011771号