JSON是什么文件?如何解析JSON中的数字?
JSON是什么文件?
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,它以易于人类阅读和编写的文本形式,结构化地存储和传输数据,由于其简洁、直观的特性,JSON已成为Web开发、API接口、配置文件等场景中广泛使用的数据格式,逐渐取代了传统的XML格式。
JSON的核心特点
- 文本格式:JSON是纯文本文件,可以用任何文本编辑器(如记事本、VS Code)打开和编辑,无需特殊工具。
- 结构清晰:采用“键值对”(Key-Value Pair)的形式组织数据,类似Python中的字典、JavaScript中的对象,结构层次分明。
- 数据类型丰富:支持多种基本数据类型,包括字符串(String)、数字(Number,包括整数和浮点数)、布尔值(Boolean)、null(空值)、数组(Array,有序列表)和对象(Object,无序列表)。
- 跨语言兼容:几乎所有编程语言(如Python、Java、C++、JavaScript等)都内置了JSON解析库,方便在不同语言间传递数据。
JSON文件的结构与示例
JSON文件通常以.json为后缀(但并非强制,也可作为文本嵌入代码中),其基本结构分为对象和数组两种:
-
对象(Object):用花括号包裹,由多个键值对组成,键(Key)必须是字符串(需用双引号包围),值(Value)可以是任意数据类型,键值对之间用逗号分隔。
{ "name": "张三", "age": 25, "isStudent": false, "address": { "city": "北京", "district": "海淀区" } } -
数组(Array):用方括号
[]包裹,由多个值(可以是任意数据类型)组成,值之间用逗号分隔,数组中的元素可以是对象,形成“对象数组”:[ { "name": "李四", "age": 30, "score": 85.5 }, { "name": "王五", "age": 22, "score": 92.0 } ]
如何解析JSON中的数字?
“解析JSON”指的是将JSON格式的文本数据,转换为编程语言中可直接操作的数据结构(如Python的字典、JavaScript的对象),并从中提取数字值,不同语言的解析方法略有差异,但核心逻辑一致:先解析JSON文本为原生数据结构,再通过键或索引访问数字值。
通用解析步骤
无论使用何种语言,解析JSON中的数字通常分为三步:
- 读取JSON文件/字符串:获取JSON格式的文本数据(如从文件读取,或直接使用API返回的JSON字符串)。
- 解析为原生数据结构:调用语言的JSON解析库,将文本转换为字典(Python)、对象(JavaScript)等。
- 提取数字值:通过键(对象)或索引(数组)访问目标数字,并根据需要转换为特定数字类型(如整数、浮点数)。
不同语言的解析示例
(1)Python:使用json库
Python内置json库,可直接解析JSON文件或字符串。
示例1:解析JSON文件中的数字
假设有一个data.json如下:
{
"userId": 1001,
"price": 99.99,
"quantity": 5,
"isActive": true
}
解析代码:
import json
# 1. 读取JSON文件
with open("data.json", "r", encoding="utf-8") as f:
json_data = f.read() # 获取JSON字符串
# 2. 解析为Python字典
data = json.loads(json_data)
# 3. 提取数字值
user_id = data["userId"] # 整数 1001
price = data["price"] # 浮点数 99.99
quantity = data["quantity"] # 整数 5
print(f"用户ID: {user_id}, 类型: {type(user_id)}")
print(f"价格: {price}, 类型: {type(price)}")
print(f"数量: {quantity}, 类型: {type(quantity)}")
输出:
用户ID: 1001, 类型: <class 'int'>
价格: 99.99, 类型: <class 'float'>
数量: 5, 类型: <class 'int'>
示例2:解析JSON数组中的数字
假设有一个students.json如下:
[
{"name": "小明", "score": 88.5, "age": 18},
{"name": "小红", "score": 92.0, "age": 17}
]
解析代码:
import json
# 读取并解析JSON数组
with open("students.json", "r", encoding="utf-8") as f:
students = json.load(f) # 直接解析为Python列表
# 提取第一个学生的分数和年龄
first_student = students[0]
score = first_student["score"] # 浮点数 88.5
age = first_student["age"] # 整数 18
print(f"分数: {score}, 类型: {type(score)}")
print(f"年龄: {age}, 类型: {type(age)}")
(2)JavaScript:使用JSON对象
JavaScript原生支持JSON解析,无需额外库。
示例1:解析JSON字符串中的数字
假设有一个JSON字符串:
const jsonString = '{"productId": 12345, "weight": 2.5, "stock": 100}';
解析代码:
// 1. 解析为JavaScript对象
const data = JSON.parse(jsonString);
// 2. 提取数字值
const productId = data.productId; // 整数 12345
const weight = data.weight; // 浮点数 2.5
const stock = data.stock; // 整数 100
console.log(`产品ID: ${productId}, 类型: ${typeof productId}`);
console.log(`重量: ${weight}, 类型: ${typeof weight}`);
console.log(`库存: ${stock}, 类型: ${typeof stock}`);
输出:
产品ID: 12345, 类型: number
重量: 2.5, 类型: number
库存: 100, 类型: number
示例2:解析JSON数组中的数字
假设有一个JSON数组字符串:
const jsonArray = '[{"x": 10, "y": 20.5}, {"x": -5, "y": 0}]';
解析代码:
const points = JSON.parse(jsonArray);
const firstPoint = points[0];
const x = firstPoint.x; // 整数 10
const y = firstPoint.y; // 浮点数 20.5
console.log(`x坐标: ${x}, y坐标: ${y}`);
(3)Java:使用org.json库或Jackson/Gson
Java中需借助第三方库(如org.json、Jackson、Gson)解析JSON,这里以org.json为例(需先添加依赖:implementation 'org.json:json:20231013')。
示例:解析JSON文件中的数字
假设有一个config.json文件:
{
"port": 8080,
"timeout": 30.5,
"maxConnections": 1000
}
解析代码:
import org.json.JSONObject;
import java.nio.file.Files;
import java.nio.file.Paths;
public class JsonParser {
public static void main(String[] args) throws Exception {
// 1. 读取JSON文件内容
String jsonContent = new String(Files.readAllBytes(Paths.get("config.json")));
// 2. 解析为JSONObject对象
JSONObject config = new JSONObject(jsonContent);
// 3. 提取数字值(getInt/getDouble自动转换类型)
int port = config.getInt("port"); // 整数 8080
double timeout = config.getDouble("timeout"); // 浮点数 30.5
int maxConnections = config.getInt("maxConnections"); // 整数 1000
System.out.println("端口: " + port + " (类型: " + ((Object)port).getClass().getSimpleName() + ")");
System.out.println("超时: " + timeout + " (类型: " + ((Object)timeout).getClass().getSimpleName() + ")");
System.out.println("最大连接数: " + maxConnections + " (类型: " + ((Object)maxConnections).getClass().getSimpleName() +


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