JSON串怎么写在String里:从基础到实用技巧
在Java开发中,我们经常需要将JSON格式的数据存储在String变量里,比如作为API请求参数、配置信息或数据交换的中间格式,但“把JSON串写在String里”看似简单,实则涉及字符串转义、格式规范、性能优化等多个细节,本文将从基础语法讲起,逐步拆解不同场景下的实现方法、常见问题及最佳实践,帮你彻底“在String中正确书写JSON串”的技巧。
JSON串在String里的基础语法:转义是核心
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其语法严格,而String类型在编程语言中通常用双引号()包裹,当JSON本身包含双引号、反斜杠等特殊字符时,必须进行“转义”——即在特殊字符前加反斜杠(\),才能确保String能正确解析JSON结构。
最简单的JSON串:无特殊字符的String
如果JSON串只包含普通字符(字母、数字、下划线、中文字符等),直接用双引号包裹即可,一个表示用户信息的JSON串:
String jsonStr = "{\"name\":\"张三\", \"age\":25, \"isStudent\":false}";
这里需要注意:Java中String的双引号需要转义,因为Java代码本身用双引号定义字符串,所以JSON原有的双引号(如"name")在Java String中要写成\",否则会导致编译错误。
包含特殊字符的JSON串:必须转义
当JSON串中包含以下特殊字符时,必须用反斜杠\转义:
- 双引号():转义为
\"(如字段值中的引号) - 反斜杠(
\):转义为\\(如路径字符串) - 换行符(
\n)、回车符(\r)、制表符(\t):转义为\n、\r、\t(如多行文本) - 控制字符(如
\b退格、\f换页):转义为对应形式
一个包含路径和多行描述的JSON串:
String jsonStr = "{\"filePath\":\"C:\\\\Users\\\\张三\\\\file.txt\", \"description\":\"这是第一行,\\n这是第二行,\"}";
解析:
- 路径中的反斜杠
\\在JSON中需要转义为\\\\(因为Java String的\本身需要转义,所以实际写两个\代表JSON中的一个\); - 描述中的换行符
\n在JSON中转义为\\n,最终在解析时会还原为真正的换行。
不同场景下的JSON串String实现方法
根据JSON的复杂程度和开发需求,将JSON串写入String有三种常见方式:直接拼接、模板化拼接、序列化生成,下面分别结合Java代码说明。
方法1:直接拼接(适用于简单JSON)
对于结构简单、字段较少的JSON串,直接用号拼接字符串是最直观的方式,但要注意转义和格式可读性。
String jsonStr = "{" +
"\"id\":1," +
"\"product\":\"华为手机\"," +
"\"price\":4999.0," +
"\"tags\":\"[\"5G\",\"拍照\",\"旗舰\"]\"" +
"}";
优点:简单直接,无需额外依赖;
缺点:字段多时可读性差,容易漏掉逗号或引号,且修改JSON结构时需调整拼接逻辑。
方法2:模板化拼接(适用于中等复杂度JSON)
当JSON字段较多或需要动态拼接时,可以用StringBuilder或字符串模板(Java 15+)提升可读性和维护性。
使用StringBuilder(Java通用)
StringBuilder sb = new StringBuilder();
sb.append("{")
.append("\"id\":2,")
.append("\"product\":\"小米平板\",")
.append("\"price\":2999.0,")
.append("\"inStock\":true")
.append("}");
String jsonStr = sb.toString();
使用字符串模板(Java 15+,更简洁)
String jsonStr = """
{
"id": 3,
"product": "iPad Pro",
"price": 6999.0,
"features": ["M2芯片", "Liquid Retina XDR显示屏"]
}
""";
注意:Java 15+的文本块()会自动处理换行和缩进,但JSON原有的双引号仍需手动转义(如文本块内写\")。
优点:可读性高,适合复杂JSON;
缺点:文本块需要Java 15+支持,动态拼接时仍需注意转义。
方法3:序列化生成(推荐,适用于复杂JSON)
实际开发中,强烈推荐使用JSON库(如Jackson、Gson、Fastjson)将对象序列化为JSON串,而非手动拼接,这种方式能避免转义错误,且支持动态数据、嵌套对象/数组等复杂结构。
示例:使用Jackson库
-
添加依赖(Maven):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
-
定义实体类并序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
public class User { private String name; private int age; private boolean isStudent;
// 构造方法、getter/setter省略
public class Main { public static void main(String[] args) throws Exception { User user = new User("李四", 30, false); ObjectMapper mapper = new ObjectMapper();
// 将对象序列化为JSON串(自动处理转义和格式)
String jsonStr = mapper.writeValueAsString(user);
System.out.println(jsonStr);
// 输出:{"name":"李四","age":30,"isStudent":false}
}
#### 示例:使用Gson库
1. 添加依赖(Maven):
```xml
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
- 序列化:
import com.google.gson.Gson;
public class Main { public static void main(String[] args) { User user = new User("王五", 22, true); Gson gson = new Gson();
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
// 输出:{"name":"王五","age":22,"isStudent":true}
}
**优点**:
- 自动处理所有转义逻辑(无需手动写`\`);
- 支持复杂嵌套结构(对象、数组、集合等);
- 可配置输出格式(如缩进、日期格式);
- 避免手动拼接导致的语法错误。
**缺点**:需要引入第三方依赖,但现代项目几乎都会使用JSON库,这已成为标准实践。
## 三、常见问题与避坑指南
### 1. 忘记转义双引号:编译或解析失败
**错误示例**:
```java
String jsonStr = "{"name":"张三"}"; // 未转义JSON的双引号
问题:Java编译器会报错,因为字符串中间的未被转义,导致字符串提前结束。
解决:给JSON的所有双引号加反斜杠:
String jsonStr = "{\"name\":\"张三\"}";
转义层级混乱:反斜杠数量错误
错误示例:
String jsonStr = "{\"path\":\"C:\\Users\\file.txt\"}"; // 少转义了反斜杠
问题:JSON串中的\U会被解析为Unicode转义符,导致路径解析错误。
解析:Java String中的\需要转义,所以JSON中的一个\在Java中要写两个\\:
String jsonStr = "{\"path\":\"C:\\\\Users\\\\file.txt\"}";
JSON格式不规范:逗号缺失或冗余
错误示例:
String jsonStr = "{\"name\":\"张三\", \"age\":25,}"; // 末尾逗号
String jsonStr = "{\"name\":\"张三\" \"age\":25}"; // 逗号缺失
问题:JSON规范不允许对象末尾有逗号,且键值对之间必须用逗号分隔,这会导致JSON解析器(如Jackson、Gson)抛出异常。
解决:严格遵循JSON语法,检查逗号是否缺失或冗余。



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