JSON串中含有中文?别慌!处理方法看这里
在开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其结构简单、可读性强被广泛使用,当JSON串中包含中文时,开发者常常会遇到乱码、解析失败等问题,本文将从“为什么会出现中文问题”出发,详细讲解JSON串中含中文的正确处理方法,涵盖编码规范、序列化、反序列化及常见场景解决方案,帮你彻底搞定中文处理难题。
为什么JSON串中的中文会出问题?
核心原因在于编码不一致,JSON标准本身使用UTF-8编码(RFC 8259规定),但实际开发中,不同环节的编码设置可能“各自为政”,导致中文在传输或存储过程中出现乱码。
- 生成JSON时:代码文件编码是GBK,但JSON串未声明UTF-8,导致中文被错误编码为字节序列;
- 传输JSON时:HTTP请求头未正确设置
Content-Type为application/json; charset=utf-8,接收方按默认编码(如ISO-8859-1)解析,中文变乱码; - 存储JSON时:数据库或文件系统使用非UTF-8编码,读取时未转换编码,中文显示异常。
处理中文的核心原则:统一UTF-8编码
无论JSON串是生成、传输还是存储,全程保持UTF-8编码一致是避免中文问题的关键,具体需做到:
- JSON串本身使用UTF-8编码,并在必要时通过
encoding字段声明(虽然JSON标准不强制要求,但显式声明可提升兼容性); - HTTP传输:请求/响应头设置
Content-Type: application/json; charset=utf-8; - 代码环境:源码文件、运行时环境(如JVM、Python解释器)均使用UTF-8编码;
- 存储介质:数据库表字符集、文件编码统一为UTF-8。
不同语言/场景下的中文处理方法
生成JSON串:确保中文正确编码
以常见编程语言为例,生成JSON串时需使用支持UTF-8的序列化库,并避免手动编码转换。
Python示例
import json
# 定义含中文的数据
data = {"name": "张三", "city": "北京", "desc": "Python工程师"}
# 序列化为JSON串(默认使用UTF-8)
json_str = json.dumps(data, ensure_ascii=False) # 关键:ensure_ascii=False
print(json_str)
# 输出:{"name": "张三", "city": "北京", "desc": "Python工程师"}
# 如果ensure_ascii=True(默认),中文会被转义为Unicode:
# {"name": "\u5f20\u4e09", "city": "\u5317\u4eac", "desc": "Python\u5de5\u7a0b\u5e08"}
关键点:json.dumps()默认使用ensure_ascii=True,会将非ASCII字符(如中文)转义为Unicode编码(如\u5f20),需设置ensure_ascii=False,保留原始中文。
Java示例
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTest {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// 定义含中文的数据
String name = "李四";
String city = "上海";
// 序列化为JSON串(Jackson默认使用UTF-8)
String jsonStr = mapper.writeValueAsString(
"{\"name\": \"" + name + "\", \"city\": \"" + city + "\"}"
);
System.out.println(jsonStr);
// 输出:{"name": "李四", "city": "上海"}
}
}
关键点:Jackson、Gson等主流Java JSON库默认使用UTF-8编码,无需额外配置,但需确保源码文件编码为UTF-8(IDE中设置文件编码为UTF-8)。
解析JSON串:避免乱码,正确解码
接收JSON串时,需确保按UTF-8编码解析,避免因编码不一致导致乱码。
JavaScript(Node.js)示例
const jsonStr = '{"name": "王五", "city": "广州", "desc": "前端开发"}';
// 直接解析(Node.js默认使用UTF-8)
const data = JSON.parse(jsonStr);
console.log(data.name); // 输出:王五
关键点:JavaScript原生JSON.parse()和JSON.stringify()始终使用UTF-8编码,无需额外处理。
Java(接收HTTP请求中的JSON)示例
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.http.HttpServletRequest;
public class RequestJsonParser {
public static void parseJson(HttpServletRequest request) throws Exception {
// 确保请求体按UTF-8读取(关键:设置request的字符编码)
request.setCharacterEncoding("UTF-8");
// 获取请求体JSON字符串
String jsonStr = request.getReader().lines().collect(Collectors.joining());
// 解析为对象
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(jsonStr, Person.class);
System.out.println(person.getName()); // 输出:王五
}
}
关键点:接收HTTP请求时,需先调用request.setCharacterEncoding("UTF-8"),确保读取请求体时使用UTF-8解码,避免乱码。
HTTP传输:设置正确的Content-Type
通过HTTP传输JSON串时,请求头和响应头必须明确指定Content-Type为application/json; charset=utf-8,告知接收方使用UTF-8解析。
示例(Spring Boot发送HTTP请求)
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class HttpJsonSender {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
// 请求头设置Content-Type
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8); // 注意:Spring 5.3+推荐用MediaType.APPLICATION_JSON with charset
// 请求体(含中文)
String requestBody = "{\"name\": \"赵六\", \"city\": \"深圳\"}";
HttpEntity<String> entity = new HttpEntity<>(requestBody, headers);
// 发送POST请求
ResponseEntity<String> response = restTemplate.postForEntity(
"https://api.example.com/user", entity, String.class
);
System.out.println(response.getBody()); // 输出响应结果(确保响应体也是UTF-8)
}
}
关键点:MediaType.APPLICATION_JSON_UTF8已废弃(Spring 5.3+),推荐使用MediaType.APPLICATION_JSON并手动设置charset,或直接使用headers.setContentType(new MediaType("application", "json", StandardCharsets.UTF_8))。
数据库存储:使用UTF-8字符集
若将JSON串存入数据库,需确保数据库、表、字段的字符集为UTF-8,否则读取时可能出现乱码。
MySQL示例
-- 创建数据库时指定字符集
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建表时,存储JSON的字段类型使用JSON(MySQL 5.7+),字符集继承数据库
CREATE TABLE user (
id INT PRIMARY KEY,
info JSON
) CHARACTER SET utf8mb4;
-- 插入含中文的JSON数据
INSERT INTO user (id, info) VALUES (
1,
'{"name": "钱七", "city": "成都", "hobby": "编程"}'
);
-- 查询JSON数据(MySQL会自动按UTF-8返回)
SELECT info FROM user WHERE id = 1;
-- 输出:{"name": "钱七", "city": "成都", "hobby": "编程"}
关键点:utf8mb4是MySQL中完整的UTF-8编码(支持Emoji和特殊字符),比utf8(仅支持3字节字符)更推荐。
常见问题与解决方案
问题:JSON串中的中文显示为Unicode(如\u5f20\u4e09)
原因:生成JSON时使用了ensure_ascii=True(Python默认)或类似配置。
解决:设置ensure_ascii=False(Python)或使用库的“非ASCII保留”模式(Java的Jackson无需设置,默认保留)。
问题:接收到的JSON串中文乱码(如)
原因:传输或解析时未使用UTF-8编码(如HTTP请求头未设置charset=utf-8,或代码按GBK解析)。
解决:检查HTTP请求/响应头Content-Type,确保代码中按UTF-8读取(如Java的request.setCharacterEncoding("UTF-8"))。



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