JSON返回的值怎么取?从基础到实践的完整指南
在现代Web开发和数据交互中,JSON(JavaScript Object Notation)已成为最常用的数据交换格式之一,无论是前端调用后端API,还是处理配置文件、爬取数据,我们都需要频繁从JSON响应中提取所需数据,本文将从JSON的基础结构讲起,结合不同编程语言和场景,详细讲解如何正确、高效地获取JSON返回的值。
先搞懂:JSON到底是什么?
JSON是一种轻量级的数据交换格式,以键值对(Key-Value Pair)为核心结构,易于人阅读和编写,也易于机器解析和生成,其基本结构包括:
对象(Object)
用 包裹,由多个键值对组成,键(Key)必须是字符串(可加双引号),值(Value)可以是任意类型,键值对之间用逗号分隔,
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "朝阳区"
}
}
数组(Array)
用 [] 包裹,由多个值(Value)组成,值可以是任意类型,元素之间用逗号分隔,
[
{"name": "李四", "age": 30},
{"name": "王五", "age": 28}
]
值(Value)的常见类型
- 基本类型:字符串(
"text")、数字(123、14)、布尔值(true/false)、null。 - 复合类型:对象()、数组(
[])。
核心:如何从JSON中取值?
取值的核心逻辑是:通过“键(Key)”定位对象中的值,通过“索引(Index)”定位数组中的元素,具体方法取决于你使用的编程语言和JSON数据的嵌套结构。
(一)前端JavaScript/TypeScript:直接访问或解析
在前端开发中,JSON数据通常来自API响应(如fetch、axios请求),需要先解析为JavaScript对象,再通过属性访问或数组索引取值。
解析JSON字符串为对象
API返回的JSON数据通常是字符串(如'{"name": "张三"}'),需用JSON.parse()转换为JS对象:
const jsonString = '{"name": "张三", "age": 25, "address": {"city": "北京"}}';
const data = JSON.parse(jsonString); // 转换为对象
取值方法
- 直接访问对象属性(键是合法标识符时):
console.log(data.name); // "张三" console.log(data.age); // 25
- 用方括号访问属性(键包含特殊字符或动态键名时):
console.log(data["name"]); // "张三" const key = "age"; console.log(data[key]); // 25
- 访问嵌套对象:
console.log(data.address.city); // "北京"
- 访问数组元素:
const jsonArray = '[{"name": "李四"}, {"name": "王五"}]'; const arrData = JSON.parse(jsonArray); console.log(arrData[0].name); // "李四" console.log(arrData[1].name); // "王五" - 处理动态/未知结构:用
for...in遍历对象键,for...of遍历数组元素:// 遍历对象 for (let key in data) { if (data.hasOwnProperty(key)) { console.log(`${key}: ${data[key]}`); } } // 遍历数组 arrData.forEach(item => { console.log(item.name); });
(二)Python:字典和列表的取值
Python内置json模块,可将JSON字符串解析为字典(dict)和列表(list),取值方式与字典/列表操作一致。
解析JSON字符串为字典/列表
import json
json_string = '{"name": "张三", "age": 25, "address": {"city": "北京"}}'
data = json.loads(json_string) # 转换为字典
取值方法
- 直接访问字典键(键是合法字符串时):
print(data["name"]) # "张三" print(data["age"]) # 25
- 用
get()方法取值(避免键不存在时报错):print(data.get("name")) # "张三" print(data.get("gender", "未知")) # 键不存在时返回默认值"未知" - 访问嵌套字典:
print(data["address"]["city"]) # "北京"
- 访问列表元素:
json_array = '[{"name": "李四"}, {"name": "王五"}]' arr_data = json.loads(json_array) print(arr_data[0]["name"]) # "李四" - 遍历字典/列表:
# 遍历字典 for key, value in data.items(): print(f"{key}: {value}") # 遍历列表 for item in arr_data: print(item["name"])
(三)Java:通过Gson或Jackson解析
Java中常用Gson(Google)或Jackson库处理JSON,需先定义与JSON结构对应的类(POJO),再通过对象属性取值。
使用Gson解析
(1)定义实体类(需与JSON结构匹配):
public class Person {
private String name;
private int age;
private Address address;
// Address嵌套类
public static class Address {
private String city;
// getter/setter省略
}
// getter/setter省略
}
(2)解析JSON字符串并取值:
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
String jsonString = "{\"name\": \"张三\", \"age\": 25, \"address\": {\"city\": \"北京\"}}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
// 取值
System.out.println(person.getName()); // "张三"
System.out.println(person.getAge()); // 25
System.out.println(person.getAddress().getCity()); // "北京"
}
}
处理数组/列表
若JSON是数组(如'[{"name": "李四"}, {"name": "王五"}]'),需将实体类放入List:
import com.google.gson.reflect.TypeToken;
import java.util.List;
// 解析数组
String jsonArrayString = "[{\"name\": \"李四\"}, {\"name\": \"王五\"}]";
List<Person> personList = gson.fromJson(jsonArrayString, new TypeToken<List<Person>>(){}.getType());
System.out.println(personList.get(0).getName()); // "李四"
(四)PHP:关联数组取值
PHP中JSON解析后通常转为关联数组(array),取值方式与数组操作一致。
解析JSON字符串为数组
$jsonString = '{"name": "张三", "age": 25, "address": {"city": "北京"}}';
$data = json_decode($jsonString, true); // 第二个参数true转为关联数组,false为对象
取值方法
- 访问关联数组键:
echo $data["name"]; // "张三" echo $data["age"]; // 25
- 用
isset()检查键是否存在:if (isset($data["gender"])) { echo $data["gender"]; } else { echo "性别未知"; // 输出"性别未知" } - 访问嵌套数组:
echo $data["address"]["city"]; // "北京"
- 处理数组JSON:
$jsonArray = '[{"name": "李四"}, {"name": "王五"}]'; $arrData = json_decode($jsonArray, true); echo $arrData[0]["name"]; // "李四"
进阶:处理复杂JSON结构的技巧
实际业务中,JSON可能包含多层嵌套、动态键名、空值等情况,需以下技巧:



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