如何轻松获取JSON中的每个值:从基础到实用技巧
在数据交互的世界里,JSON(JavaScript Object Notation)以其轻量、易读的特性,已成为前后端数据传输的“通用语言”,无论是调用API接口、解析配置文件,还是处理前端数据,我们都需要从JSON中提取具体的值。怎么拿取JSON里面的每个值呢?本文将从JSON的结构入手,结合不同编程语言和工具,带你提取JSON值的实用方法。
先搞懂:JSON的“长什么样”?
要提取值,得先认识JSON的结构,JSON本质上是一种键值对(Key-Value Pair)的数据格式,常见的结构有两种:
对象(Object):用 包裹,类似Python的字典、Java的Map
结构示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
- 特点:由多个键值对组成,键(如
"name")必须是字符串,值(如"张三"、25、false、["数学", "英语"])可以是字符串、数字、布尔值、数组,甚至另一个对象(嵌套对象)。
数组(Array):用 [] 包裹,类似Python的列表、Java的数组
结构示例:
[
{"id": 1, "product": "手机", "price": 3999},
{"id": 2, "product": "电脑", "price": 6999},
{"id": 3, "product": "平板", "price": 2999}
]
- 特点:有序的值的集合,每个元素可以是任意JSON类型(包括对象、数组等)。
核心思路:从“根”到“叶”,逐层定位
提取JSON值的核心逻辑是:通过“键”定位对象中的值,通过“索引”定位数组中的元素,对于嵌套结构(如对象里嵌套对象、数组里嵌套对象),则需要逐层“”,像剥洋葱一样找到目标值。
不同场景下的取值方法
场景1:直接取“顶层值”(无嵌套,无数组)
如果JSON是简单的对象(无嵌套、无数组),直接通过键名即可获取。
示例JSON:
{
"name": "李四",
"age": 30,
"job": "工程师"
}
取值方法(以常见语言为例):
Python(使用json库解析后)
import json
# 假设json_str是从文件或API获取的JSON字符串
json_str = '{"name": "李四", "age": 30, "job": "工程师"}'
data = json.loads(json_str) # 解析为字典
# 直接通过键名取值
name = data["name"] # 结果:"李四"
age = data["age"] # 结果:30
job = data["job"] # 结果:"工程师"
print(f"姓名:{name}, 年龄:{age}, 职业:{job}")
注意:如果键不存在,直接访问会抛出KeyError,可用data.get("键名")安全取值(返回None或默认值)。
JavaScript(浏览器或Node.js环境)
// 假设jsonData是JSON对象(通常通过JSON.parse解析字符串得到)
const jsonData = {
"name": "李四",
"age": 30,
"job": "工程师"
};
// 直接通过键名取值(JavaScript对象键名可加引号也可不加)
const name = jsonData.name; // 或 jsonData["name"],结果:"李四"
const age = jsonData.age; // 结果:30
const job = jsonData.job; // 结果:"工程师"
console.log(`姓名:${name}, 年龄:${age}, 职业:${job}`);
注意:JavaScript中,jsonData.键名和jsonData["键名"]效果一致,后者可动态拼接键名(如jsonData[key],key是变量)。
Java(使用Gson或Jackson库)
以Gson为例:
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"李四\", \"age\": 30, \"job\": \"工程师\"}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonStr, Person.class); // 解析为自定义类
// 直接通过对象的getter方法取值
String name = person.getName(); // 结果:"李四"
int age = person.getAge(); // 结果:30
String job = person.getJob(); // 结果:"工程师"
System.out.println("姓名:" + name + ", 年龄:" + age + ", 职业:" + job);
}
}
// 自定义类,字段名需与JSON键名一致(可通过@SerializedName注解映射)
class Person {
private String name;
private int age;
private String job;
// getter和setter方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getJob() { return job; }
public void setJob(String job) { this.job = job; }
}
场景2:取“数组中的值”
如果JSON包含数组,需先通过索引定位数组元素,再根据元素类型(对象/基本类型)取值。
示例JSON(场景1的扩展,增加“爱好”数组):
{
"name": "李四",
"age": 30,
"hobbies": ["篮球", "阅读", "旅行"]
}
取值方法:
Python
import json
json_str = '{"name": "李四", "age": 30, "hobbies": ["篮球", "阅读", "旅行"]}'
data = json.loads(json_str)
# 取数组:通过索引(从0开始)
hobbies = data["hobbies"] # 结果:["篮球", "阅读", "旅行"]
first_hobby = hobbies[0] # 结果:"篮球"
second_hobby = hobbies[1] # 结果:"阅读"
# 遍历数组所有值
for hobby in hobbies:
print(hobby) # 依次输出:"篮球", "阅读", "旅行"
JavaScript
const jsonData = {
"name": "李四",
"age": 30,
"hobbies": ["篮球", "阅读", "旅行"]
};
// 取数组:通过索引
const hobbies = jsonData.hobbies; // 结果:["篮球", "阅读", "旅行"]
const firstHobby = hobbies[0]; // 结果:"篮球"
const secondHobby = hobbies[1]; // 结果:"阅读"
// 遍历数组(forEach或for...of)
hobbies.forEach(hobby => console.log(hobby)); // 依次输出:"篮球", "阅读", "旅行"
Java(Gson)
import com.google.gson.Gson;
import java.util.List;
public class Main {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"李四\", \"age\": 30, \"hobbies\": [\"篮球\", \"阅读\", \"旅行\"]}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonStr, Person.class);
// 取数组:List集合
List<String> hobbies = person.getHobbies(); // 结果:["篮球", "阅读", "旅行"]
String firstHobby = hobbies.get(0); // 结果:"篮球"
// 遍历数组
for (String hobby : hobbies) {
System.out.println(hobby); // 依次输出:"篮球", "阅读", "旅行"
}
}
}
class Person {
private String name;
private int age;
private List<String> hobbies;
// getter和setter
public List<String> getHobbies() { return hobbies; }
public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
// 其他getter/setter省略...
}
场景3:取“嵌套结构中的值”(对象里嵌套对象/数组)
实际JSON中常出现嵌套结构(如“地址”是对象,“课程列表”是数组),需逐层定位。
示例JSON(场景1的扩展,增加嵌套对象和数组):
{
"name": "王五",
"info": {
"age": 28,
"job": "设计师",
"contact": {
"email": "wangwu@example.com",
"phone": "138123456


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