JSON如何传递实体类:从基础到实践的全面指南
在现代软件开发中,JSON(JavaScript Object Notation)已成为前后端数据交互的主流格式,无论是RESTful API、微服务通信,还是移动端与后端的数据同步,都离不开JSON的身影,而“如何将实体类(Entity Class)通过JSON传递”,是开发者日常工作中必须的核心技能,本文将从基础概念出发,详细讲解实体类与JSON的转换方法、不同场景下的实践方案,以及常见问题的解决方案,助你彻底这一技术。
基础:实体类与JSON的“亲密关系”
什么是实体类?
实体类是面向对象编程(OOP)中的概念,通常用于映射数据库表结构或业务模型中的实体,一个用户实体类User可能包含id、username、email、createTime等属性,每个属性对应数据库表中的一列或业务中的一个字段,实体类的核心作用是封装数据,提供类型化的数据访问方式(如user.getId()、user.setUsername())。
JSON是什么?
JSON是一种轻量级的数据交换格式,以“键值对”(Key-Value Pair)的形式组织数据,结构清晰、易于人阅读和机器解析,其基本结构包括:
- 对象:用表示,包含多个键值对,如
{"name": "张三", "age": 18}。 - 数组:用
[]表示,有序的值集合,如[{"name": "张三"}, {"name": "李四"}]。
为什么需要用JSON传递实体类?
前后端分离架构下,前端(如浏览器、移动端)只能理解文本数据,而后端(如Java、Python、Go)使用对象(实体类)处理业务逻辑,JSON作为“中间人”,能将后端的实体类对象序列化为文本格式(发送给前端),同时将前端传来的JSON文本反序列化为实体类对象(供后端处理),实现数据的跨语言、跨平台传递。
核心:实体类与JSON的转换方法
实体类与JSON的转换本质是序列化(Serialization)和反序列化(Deserialization):
- 序列化:将实体类对象转换为JSON字符串(后端→前端)。
- 反序列化:将JSON字符串转换为实体类对象(前端→后端)。
不同编程语言提供了丰富的工具库实现这一过程,下面以主流语言为例展开说明。
Java:Jackson与Gson的“双雄争霸”
Java生态中,Jackson和Gson是处理JSON的两大主力库。
(1)Jackson:Spring Boot的“默认宠儿”
Jackson是Spring Boot框架默认的JSON处理库,功能强大、性能优异。
示例:实体类与JSON互转
// 1. 定义实体类
public class User {
private Long id;
private String username;
private String email;
private Date createTime;
// 必须提供无参构造器(反序列化时需要)
public User() {}
// getter/setter方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
}
// 2. 序列化:对象→JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setId(1L);
user.setUsername("张三");
user.setEmail("zhangsan@example.com");
user.setCreateTime(new Date());
// 转换为JSON字符串(默认格式)
String jsonStr = objectMapper.writeValueAsString(user);
System.out.println(jsonStr);
// 输出:{"id":1,"username":"张三","email":"zhangsan@example.com","createTime":1678886400000}
// 美化输出(格式化JSON)
String prettyJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println(prettyJson);
// 输出:
// {
// "id" : 1,
// "username" : "张三",
// "email" : "zhangsan@example.com",
// "createTime" : 1678886400000
// }
// 3. 反序列化:JSON字符串→对象
String json = "{\"id\":2,\"username\":\"李四\",\"email\":\"lisi@example.com\",\"createTime\":1678886400000}";
User user2 = objectMapper.readValue(json, User.class);
System.out.println(user2.getUsername()); // 输出:李四
Jackson注解:灵活控制JSON映射
Jackson提供了丰富的注解,解决实体类与JSON结构不匹配的问题:
@JsonProperty:修改JSON字段名,如@JsonProperty("user_name") private String username;。@JsonIgnore:忽略字段(不参与序列化/反序列化),如@JsonIgnore private String password;。@JsonFormat:格式化日期/时间,如@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime;。@JsonCreator:自定义反序列化构造逻辑(适用于无参构造器不适用场景)。
(2)Gson:Google的“简洁工具”
Gson是Google开发的JSON库,API简洁、易于上手,尤其适合处理复杂嵌套对象。
示例:实体类与JSON互转
// 1. 定义实体类(同上,无需额外注解)
// 2. 序列化:对象→JSON字符串
Gson gson = new Gson();
User user = new User();
user.setId(1L);
user.setUsername("张三");
user.setEmail("zhangsan@example.com");
user.setCreateTime(new Date());
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
// 输出:{"id":1,"username":"张三","email":"zhangsan@example.com","createTime":Jan 1, 2023, 12:00:00 AM}
// 3. 反序列化:JSON字符串→对象
String json = "{\"id\":2,\"username\":\"李四\",\"email\":\"lisi@example.com\",\"createTime\":\"2023-03-15 14:30:00\"}";
User user2 = gson.fromJson(json, User.class);
System.out.println(user2.getUsername()); // 输出:李四
Gson注解:自定义映射规则
@SerializedName:修改JSON字段名,如@SerializedName("user_name") private String username;。@Expose:控制字段是否参与序列化(需new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create())。@JsonAdapter:自定义字段的序列化/反序列化逻辑。
Python:json模块与Pydantic的“灵活组合”
Python内置json模块,可轻松实现基本JSON操作;Pydantic则提供了数据验证和类型提示功能,适合现代Web开发(如FastAPI)。
(1)json模块:基础中的基础
import json
from datetime import datetime
# 1. 定义实体类(Python用类模拟)
class User:
def __init__(self, id: int, username: str, email: str, create_time: datetime):
self.id = id
self.username = username
self.email = email
self.create_time = create_time
# 2. 序列化:对象→JSON字符串(需自定义序列化逻辑)
user = User(id=1, username="张三", email="zhangsan@example.com", create_time=datetime.now(2023, 1, 1))
# 默认json.dumps()无法处理datetime对象,需自定义编码器
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
return super().default(obj)
json_str = json.dumps(user.__dict__, cls=DateTimeEncoder)
print(json_str)
# 输出:{"id": 1, "username": "张三", "email": "zhangsan@example.com", "create_time": "2023-01-01 00:00:00"}
# 3. 反序列化:JSON字符串→对象
json_data = '{"id": 2, "username": "李四", "email": "lisi@example.com", "create_time": "2023-03-15 14:30:00"}"
user_data = json.loads(json_data)
user2 = User(
id=user_data["id"],
username=user_data["username"],
email=user_data["email"],
create_time=datetime.strptime(user_data["create_time"], "%Y-%m-%d %H:%M:%S")
)
print(user2.username) # 输出:李四
(2)Pydantic:带类型提示的“高级工具”
Py



还没有评论,来说两句吧...