怎么在JSON中取数据:从基础到实践的全面指南
JSON是什么?为什么需要数据取用?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读、易解析的特性,成为Web开发、API接口、配置文件等场景中的主流数据格式,无论是前端从后端获取用户信息,还是读取配置文件中的参数,都离不开对JSON数据的取用,JSON数据取用的方法,是程序员处理数据的基础技能。
JSON数据的基本结构:看懂“数据地图”
在取数据前,先要理解JSON的两种核心结构:
对象(Object)
用 表示,键值对集合,键(key)必须是字符串(双引号包裹),值(value)可以是任意类型。
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array)
用 [] 表示,有序值列表,值可以是任意类型(包括对象或数组)。
[
{"id": 1, "product": "手机", "price": 2999},
{"id": 2, "product": "电脑", "price": 5999}
]
关键点:取数据本质是通过“键名”(对象)或“索引”(数组)定位到目标值,嵌套结构则需逐层“导航”。
不同语言/环境中取JSON数据的方法
JSON是跨语言的,不同编程语言提供了各自的解析库和语法,但核心逻辑一致:先解析JSON字符串为语言原生数据结构(如Python的字典、JavaScript的对象),再通过键或索引取值。
JavaScript:原生操作与库辅助
JavaScript中,JSON可通过 JSON.parse() 将字符串转为对象/数组,再通过点()或方括号([])取值。
示例1:取简单对象值
const jsonStr = '{"name": "李四", "age": 30}';
const data = JSON.parse(jsonStr);
// 通过键名取值(点语法)
console.log(data.name); // 输出: 李四
// 通过键名取值(方括号语法,适合键名含特殊字符或变量)
console.log(data["age"]); // 输出: 30
示例2:取嵌套对象值
const nestedJson = '{"user": {"name": "王五", "contact": {"email": "wangwu@example.com"}}}';
const nestedData = JSON.parse(nestedJson);
console.log(nestedData.user.contact.email); // 逐层通过点语法导航,输出: wangwu@example.com
示例3:取数组值
const arrayJson = '[{"id": 1}, {"id": 2}]';
const arrayData = JSON.parse(jsonStr);
// 通过索引取数组元素
console.log(arrayData[0].id); // 输出: 1
进阶:使用 Lodash 简化嵌套取值
若JSON嵌套很深(如 data.a.b.c.d.value),可用 Lodash 的 get 方法避免中间层报错:
const _ = require("lodash");
const deepData = {"a": {"b": {"c": null}}};
console.log(_.get(deepData, "a.b.c.d", "默认值")); // 输出: 默认值(若路径不存在则返回默认值)
Python:字典式取值与 json 模块
Python中,json.loads() 将JSON字符串转为字典(dict)或列表(list),取值方式与字典/列表一致。
示例1:取简单对象值
import json
json_str = '{"name": "赵六", "age": 28}'
data = json.loads(json_str)
# 通过键名取值(字典语法)
print(data["name"]) # 输出: 赵六
# 使用 get 方法(键不存在时返回 None,避免报错)
print(data.get("age")) # 输出: 28
print(data.get("gender", "未知")) # 输出: 未知(指定默认值)
示例2:取嵌套对象值
nested_json = '{"user": {"name": "钱七", "contact": {"phone": "13800138000"}}}'
nested_data = json.loads(nested_json)
print(nested_data["user"]["contact"]["phone"]) # 逐层通过键名取值,输出: 13800138000
示例3:取数组值
array_json = '[{"id": 1, "name": "商品A"}, {"id": 2, "name": "商品B"}]'
array_data = json.loads(array_json)
# 通过索引取数组元素,再通过键名取对象属性
print(array_data[1]["name"]) # 输出: 商品B
Java:通过 JSONObject 和 JSONArray 操作
Java中,常用 org.json 库(或 Jackson/Gson)解析JSON,通过 getString()、getInt() 等方法取值。
示例1:取简单对象值
import org.json.JSONObject;
public class JsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"孙八\", \"age\": 35}";
JSONObject data = new JSONObject(jsonStr);
// 通过 getString、getInt 等方法取值(需指定类型)
String name = data.getString("name");
int age = data.getInt("age");
System.out.println(name + ": " + age); // 输出: 孙八: 35
}
}
示例2:取嵌套对象值
String nestedJson = "{\"user\": {\"name\": \"周九\", \"contact\": {\"email\": \"zhoujiu@example.com\"}}}";
JSONObject nestedData = new JSONObject(nestedJson);
String email = nestedData.getJSONObject("user")
.getJSONObject("contact")
.getString("email");
System.out.println(email); // 输出: zhoujiu@example.com
示例3:取数组值
String arrayJson = "[{\"id\": 1}, {\"id\": 2}]";
JSONArray arrayData = new JSONArray(arrayJson);
int id = arrayData.getJSONObject(1).getInt("id"); // 通过索引取对象,再取属性
System.out.println(id); // 输出: 2
其他语言:类似逻辑,适配语法
- C#:使用
Newtonsoft.Json或System.Text.Json,反序列化为对象后通过属性取值(如data.Name)。 - PHP:通过
json_decode()将JSON转为数组(true参数)或对象,再取值(如$data["name"]或$data->name)。 - Go:使用
encoding/json包,定义结构体后通过json.Unmarshal()反序列化,通过结构体字段取值。
取数据的常见场景与技巧
处理不存在的键/索引:避免报错
- JavaScript:用 可选链(ES2020+)和 空值合并,如
data.user?.contact?.email ?? "无邮箱"。 - Python:用字典的
get()方法指定默认值,如data.get("gender", "未知")。 - Java:用
optString()、optInt()等方法(非强制类型转换,键不存在时返回默认值)。
动态键名/变量取值
若键名是变量(如 key = "name"),需用方括号语法:
- JavaScript:
data[key] - Python:
data[key] - Java:
data.getString(key)
循环遍历数组/对象
-
遍历数组:
const arrayData = JSON.parse('[{"id": 1}, {"id": 2}]'); arrayData.forEach(item => console.log(item.id));array_data = json.loads('[{"id": 1}, {"id": 2}]') for item in array_data: print(item["id"]) -
遍历对象(键值对):
const objData = JSON.parse('{"a": 1, "b": 2}'); for (let key in objData) { console.log(key, objData[key]); }obj_data = json.loads('{"a": 1, "b": 2}')



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