JSON与字符串的相互转换:从基础到实践的全面指南
在Web开发、数据存储和跨语言通信中,JSON(JavaScript Object Notation)因其轻量级、易读和结构化的特点,已成为最常用的数据交换格式之一,而字符串则是编程中最基础的数据类型,无论是网络传输、文件存储还是配置解析,数据常以字符串形式存在,JSON与字符串之间的相互转换,是开发者必备的核心技能,本文将从基础概念出发,结合不同编程语言的实践案例,详细解析JSON与字符串转换的方法、注意事项及常见问题。
JSON与字符串:基础概念解析
什么是JSON?
JSON(JavaScript Object Notation)是一种基于JavaScript语言标准的数据交换格式,采用“键值对”(Key-Value Pair)的方式组织数据,其结构包括两种类型:
- 对象(Object):用花括号 表示,键值对以
key: value的形式存在,多个键值对之间用逗号分隔,{"name": "张三", "age": 30}。 - 数组(Array):用方括号
[]表示,元素之间用逗号分隔,["apple", "banana", "cherry"]。
JSON的值(value)可以是字符串(用双引号 包裹)、数字、布尔值(true/false)、null、对象或数组。严格区分字符串和JSON:字符串是纯文本数据,而JSON是具有特定结构的数据格式,"{"name": "张三"}" 是一个JSON格式的字符串,而 "{name: "张三"}"(缺少双引号)则不是合法的JSON。
为什么需要JSON与字符串转换?
JSON虽然结构化,但在实际应用中常以字符串形式存在:
- 网络传输:HTTP请求/响应中的数据需通过JSON字符串传输(如RESTful API的请求体和响应体)。
- 文件存储:配置文件(如
config.json)、数据库导出的数据常以JSON字符串形式保存到文件。 - 跨语言通信:不同编程语言(如Python、Java、JavaScript)通过JSON字符串实现数据交互,避免语言原生数据类型的兼容性问题。
将JSON对象转换为字符串(序列化)以便传输或存储,或将字符串转换为JSON对象(反序列化)以便程序处理,是开发中的高频操作。
JSON字符串 → JSON对象:反序列化(解析)
反序列化(Deserialization)是指将符合JSON格式的字符串转换为编程语言中的原生数据结构(如JavaScript的Object/Array、Python的dict/list等),不同语言提供了内置方法或库来实现这一操作。
JavaScript:JSON.parse()
JavaScript中,使用全局对象JSON的parse()方法将JSON字符串解析为对象或数组。
示例代码:
// JSON字符串
const jsonString = '{"name": "李四", "age": 25, "hobbies": ["reading", "coding"]}';
// 反序列化为JavaScript对象
const obj = JSON.parse(jsonString);
console.log(obj); // 输出: { name: '李四', age: 25, hobbies: [ 'reading', 'coding' ] }
console.log(obj.name); // 输出: 李四
console.log(obj.hobbies[0]); // 输出: reading
// JSON数组字符串
const jsonArrayString = '[{"id": 1, "task": "学习"}, {"id": 2, "task": "工作"}]';
const arr = JSON.parse(jsonArrayString);
console.log(arr); // 输出: [ { id: 1, task: '学习' }, { id: 2, task: '工作' } ]
注意事项:
- 字符串格式必须合法:JSON字符串必须严格遵循JSON规范(如键必须用双引号、字符串值必须用双引号),否则会抛出
SyntaxError。const invalidJson = "{'name': '王五'}"; // 键用单引号,非法 JSON.parse(invalidJson); // 报错: SyntaxError: Unexpected token ' in JSON - 处理异常:使用
try-catch捕获解析错误,避免程序中断。try { JSON.parse(invalidJson); } catch (error) { console.error("JSON解析失败:", error.message); }
Python:json.loads()
Python中,使用json模块的loads()(load string)方法将JSON字符串转换为字典(dict)或列表(list)。
示例代码:
import json
# JSON字符串
json_string = '{"name": "赵六", "age": 28, "is_student": false}'
# 反序列化为Python字典
data_dict = json.loads(json_string)
print(data_dict) # 输出: {'name': '赵六', 'age': 28, 'is_student': False}
print(data_dict["name"]) # 输出: 赵六
# JSON数组字符串
json_array_string = '[{"city": "北京"}, {"city": "上海"}]'
data_list = json.loads(json_array_string)
print(data_list) # 输出: [{'city': '北京'}, {'city': '上海'}]
注意事项:
- 数据类型映射:JSON数据会自动转换为Python对应类型:
- JSON
string→ Pythonstr - JSON
number→ Pythonint/float - JSON
boolean→ Pythonbool - JSON
null→ PythonNone
- JSON
- 异常处理:非法JSON字符串会抛出
json.JSONDecodeError,需用try-except捕获。invalid_json = "{'key': 'value'}" # 单引号非法 try: json.loads(invalid_json) except json.JSONDecodeError as e: print(f"JSON解析失败: {e}") # 输出: JSON解析失败: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Java:Jackson/Gson库
Java没有内置的JSON解析方法,需借助第三方库(如Jackson、Gson、Fastjson),以Jackson为例:
准备工作:
添加Jackson依赖(Maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
示例代码:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonParseExample {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\"name\": \"钱七\", \"age\": 35, \"isMarried\": true}";
try {
// 反序列化为Java对象(需定义User类)
User user = objectMapper.readValue(jsonString, User.class);
System.out.println(user.getName()); // 输出: 钱七
System.out.println(user.getAge()); // 输出: 35
// 反序列化为List
String jsonArrayString = "[{\"city\": \"广州\"}, {\"city\": \"深圳\"}]";
List<City> cities = objectMapper.readValue(jsonArrayString,
new TypeReference<List<City>>() {});
System.out.println(cities.get(0).getCity()); // 输出: 广州
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 定义User类(需与JSON键名匹配)
class User {
private String name;
private int age;
private boolean isMarried;
// getters和setters
}
class City {
private String city;
// getters和setters
}
注意事项:
- 对象属性匹配:JSON的键需与Java类的属性名一致(可通过注解
@JsonProperty("key")自定义映射)。 - 异常处理:需捕获
JsonProcessingException。
JSON对象 → JSON字符串:序列化
序列化(Serialization)是指将编程语言中的原生数据结构(如JavaScript的Object/Array、Python的dict/list)转换为JSON字符串,以便传输或存储。
JavaScript:JSON.stringify()
JavaScript中,使用JSON.stringify()方法将对象或数组序列化为JSON字符串。
示例代码:
// JavaScript对象
const obj = {
name: "孙八",
age: 40,
hobbies: ["travel", "photography"],
address: null
};
// 序列化为JSON字符串
const jsonString = JSON.stringify(obj);
console.log(jsonString);
// 输出: {"name":"孙八","age":40,"hobbies":["travel","photography"],"address":null}
// 格式化输出(缩进2个空格)
const formattedJsonString = JSON.stringify(obj, null, 2);
console.log(formattedJsonString);
/* 输出:
{
"name": "孙八",
"age":


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