使用JSON怎么取值:从基础到实践的全面指南
在数据交换和存储的场景中,JSON(JavaScript Object Notation)以其轻量、易读和结构化的特点,已成为前后端交互、API响应、配置文件等领域的首选格式,无论是前端接收后端返回的数据,还是解析本地存储的配置信息,JSON取值都是开发中的必备技能,本文将从JSON的基础结构出发,详细介绍不同场景下的取值方法,并通过代码示例帮助你从“不会”到“会”,再到“灵活运用”。
先搞懂:JSON到底是什么?
JSON是一种基于JavaScript对象语法的数据格式,它由两种核心结构组成:
对象(Object)
用 包裹,由“键值对”(Key-Value Pair)组成,键是字符串(需用双引号包裹),值可以是字符串、数字、布尔值、数组、对象甚至null,多个键值对之间用逗号分隔。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array)
用 [] 包裹,由多个值组成,值可以是任意JSON支持的类型(包括对象),多个值之间用逗号分隔。
示例:
[
{"id": 1, "name": "商品A"},
{"id": 2, "name": "商品B"}
]
JSON取值的“通用思维”:路径定位
无论是哪种编程语言,JSON取值的本质都是“通过路径定位到目标值”,路径可以类比于“文件路径”:从根节点出发,逐层,最终找到目标数据,上面示例JSON中“张三所在的城市”,路径就是 address.city。
我们以JavaScript(前端最常用)、Python(后端常用)和Java(企业级开发常用)为例,讲解具体的取值方法。
不同语言中的JSON取值实践
JavaScript:原生操作与Lodash辅助
JavaScript是JSON的“母语”,支持直接解析和操作JSON数据。
(1)解析JSON字符串为对象/数组
后端返回的数据通常是JSON字符串(如'{"name": "张三"}'),需先用JSON.parse()转换为JavaScript对象/数组:
const jsonString = '{"name": "张三", "age": 25}';
const data = JSON.parse(jsonString); // 转换为对象
console.log(data.name); // 输出:张三
(2)基础取值:点访问法与方括号访问法
-
点访问法():适用于键是合法标识符(无空格、无特殊字符)的情况。
const data = { "name": "张三", "address": {"city": "北京"} }; console.log(data.name); // 输出:张三 console.log(data.address.city); // 输出:北京 -
方括号访问法(
[]):适用于键包含特殊字符(如空格、)或动态键名的情况。const data = { "user name": "李四", // 键含空格 "1st-course": "数学" // 键含数字和- }; console.log(data["user name"]); // 输出:李四 console.log(data["1st-course"]); // 输出:数学 // 动态键名场景 const key = "age"; console.log(data[key]); // 假设data中有age属性,输出对应值
(3)数组取值:通过索引访问
数组通过索引(从0开始)取值,支持方括号:
const courses = ["数学", "英语", "物理"]; console.log(courses[0]); // 输出:数学 console.log(courses[2]); // 输出:物理
(4)嵌套取值:逐层定位
当数据多层嵌套时,需从外到内逐层访问:
const data = {
"user": {
"name": "王五",
"contacts": {
"email": "wangwu@example.com",
"phones": ["13800138000", "13900139000"]
}
}
};
console.log(data.user.name); // 输出:王五
console.log(data.user.contacts.email); // 输出:wangwu@example.com
console.log(data.user.contacts.phones[1]); // 输出:13900139000
(5)安全取值:可选链()与空值合并()
如果JSON结构可能缺失某些层级(如后端返回的数据中某些字段可能为undefined),直接访问会报错,ES2020引入的可选链和空值合并可解决:
const data = {
"user": {
"name": "赵六"
// 没有 contacts 字段
}
};
// 错误方式:data.user.contacts.email 会报错
// 安全方式:可选链 + 空值合并
const email = data.user?.contacts?.email ?? "未提供";
console.log(email); // 输出:未提供
(6)复杂场景:Lodash辅助取值
对于深层嵌套或复杂条件(如取数组中满足条件的对象的某个值),Lodash的_.get()方法更简洁:
const _ = require('lodash');
const data = {
"users": [
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30}
]
};
// 取第一个用户的name(路径:users[0].name)
const name = _.get(data, 'users[0].name'); // 输出:张三
// 取年龄大于28的用户的名字(路径:users[1].name)
const olderUser = _.get(data, 'users[1].name'); // 输出:李四
Python:json模块 + 字典/列表操作
Python中,JSON数据通过json模块解析为字典(dict)和列表(list),取值方式与字典/列表操作一致。
(1)解析JSON字符串为字典/列表
用json.loads()解析字符串,json.load()解析文件(如从本地.json文件读取):
import json
json_string = '{"name": "张三", "age": 25, "courses": ["数学", "英语"]}'
data = json.loads(json_string) # 转换为字典
print(data["name"]) # 输出:张三
# 从文件读取
with open("config.json", "r", encoding="utf-8") as f:
data = json.load(f)
(2)基础取值:字典键访问与列表索引
-
字典取值:通过键访问,支持
dict[key]或dict.get(key)(后者键不存在时返回None,不会报错)。data = { "name": "张三", "address": {"city": "北京"} } print(data["name"]) # 输出:张三 print(data.get("age", 0)) # 键不存在,返回默认值0 -
列表取值:通过索引访问(从0开始)。
courses = ["数学", "英语", "物理"] print(courses[0]) # 输出:数学
(3)嵌套取值:逐层定位
与JavaScript类似,从外到内逐层访问:
data = {
"user": {
"name": "王五",
"contacts": {
"email": "wangwu@example.com",
"phones": ["13800138000", "13900139000"]
}
}
}
print(data["user"]["name"]) # 输出:王五
print(data["user"]["contacts"]["phones"][1]) # 输出:13900139000
(4)安全取值:dict.get() + 异常处理
Python中,直接访问不存在的键会抛出KeyError,可通过dict.get()或try-except处理:
data = {"name": "赵六"} # 没有 age 字段
# 方式1:dict.get() 提供默认值
age = data.get("age", 0) # 输出:0
# 方式2:try-except 捕获异常
try:
age = data["age"]
except KeyError:
age = 0


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