JSON如何设置环境变量:从配置到实践的全面指南
在软件开发中,环境变量是管理配置信息的重要方式,它能让应用在不同环境(开发、测试、生产)中灵活切换参数,而无需修改代码,JSON(JavaScript Object Notation)因其结构清晰、易读性强,常被用于存储和管理环境变量配置,本文将详细介绍如何通过JSON设置环境变量,包括基本原理、操作步骤、常见场景及最佳实践,帮助开发者高效管理应用配置。
为什么用JSON设置环境变量?
传统环境变量多通过系统环境变量(如Linux的export、Windows的set)或配置文件(如.env)管理,但这些方式存在一定局限:系统环境变量全局生效,易冲突;.env文件为纯文本,难以管理复杂嵌套结构,JSON作为结构化数据格式,优势在于:
- 层次化结构:支持嵌套对象和数组,适合管理多维度配置(如数据库、API密钥、环境开关等);
- 可读性强:键值对结构清晰,注释可通过或标注(需配合工具),便于团队协作;
- 易扩展:新增配置只需添加键值对,无需修改代码逻辑;
- 跨语言支持:JSON是通用格式,Python、Java、Node.js等语言均可轻松解析。
JSON配置文件的基本结构
JSON配置文件通常以.json为后缀(如config.json、env.json),核心是键值对嵌套结构,以下是一个示例,展示不同环境的配置:
{
"development": {
"database": {
"host": "localhost",
"port": 3306,
"username": "dev_user",
"password": "dev_password"
},
"api": {
"baseUrl": "http://dev-api.example.com",
"timeout": 5000
},
"debug": true,
"logLevel": "debug"
},
"production": {
"database": {
"host": "prod-db.example.com",
"port": 3306,
"username": "prod_user",
"password": "${DB_PASSWORD}" // 支持变量引用(需结合工具)
},
"api": {
"baseUrl": "https://api.example.com",
"timeout": 3000
},
"debug": false,
"logLevel": "error"
}
}
- 顶级键:通常代表环境名称(如
development、production),用于区分不同环境; - 嵌套键:按模块或功能分类(如
database、api),避免配置混乱; - 值类型:支持字符串、数字、布尔值、数组、null等,灵活适配不同需求。
如何通过JSON设置环境变量?
直接读取JSON文件并加载为环境变量
这种方式的核心是:读取JSON文件,将其中的键值对转换为系统环境变量,不同语言的实现方式略有差异,以下以Python和Node.js为例。
(1)Python实现
使用Python的json模块读取文件,并通过os.environ设置环境变量:
import json
import os
def load_env_from_json(file_path, env_key="development"):
"""读取JSON配置文件并设置环境变量"""
with open(file_path, "r", encoding="utf-8") as f:
config = json.load(f)
# 获取指定环境的配置
env_config = config.get(env_key, {})
# 遍历配置,设置为环境变量
for key, value in env_config.items():
# 支持嵌套键(如database.host -> DATABASE_HOST)
if isinstance(value, dict):
for sub_key, sub_value in value.items():
env_var_name = f"{key.upper()}_{sub_key.upper()}"
os.environ[env_var_name] = str(sub_value)
else:
os.environ[key.upper()] = str(value)
# 使用示例
load_env_from_json("config.json", "production")
print(os.environ.get("DATABASE_HOST")) # 输出: prod-db.example.com
print(os.environ.get("DEBUG")) # 输出: false
说明:
- 嵌套键通过下划线连接并转为大写(如
database.host→DATABASE_HOST),避免与系统环境变量冲突; - 所有值均转为字符串类型(环境变量本质为字符串)。
(2)Node.js实现
使用Node.js的fs模块读取文件,并通过process.env设置环境变量:
const fs = require('fs');
const path = require('path');
function loadEnvFromJson(filePath, envKey = 'development') {
// 读取JSON文件
const config = JSON.parse(fs.readFileSync(path.resolve(filePath), 'utf8'));
const envConfig = config[envKey] || {};
// 遍历配置,设置为环境变量
Object.keys(envConfig).forEach(key => {
const value = envConfig[key];
if (typeof value === 'object' && value !== null) {
// 处理嵌套对象(如database.host)
Object.keys(value).forEach(subKey => {
const envVarName = `${key.toUpperCase()}_${subKey.toUpperCase()}`;
process.env[envVarName] = String(value[subKey]);
});
} else {
process.env[key.toUpperCase()] = String(value);
}
});
}
// 使用示例
loadEnvFromJson('config.json', 'production');
console.log(process.env.DATABASE_HOST); // 输出: prod-db.example.com
console.log(process.env.DEBUG); // 输出: false
说明:
- 与Python类似,嵌套键转为大写并以下划线连接;
- 需确保Node.js环境已安装
fs模块(内置模块,无需额外安装)。
结合工具实现动态环境变量管理
当配置中需要引用敏感信息(如数据库密码、API密钥)时,直接硬编码在JSON中不安全,此时可结合工具(如dotenv、python-dotenv)实现动态加载,支持从外部文件或环境变量中获取值。
(1)Python + python-dotenv
安装依赖:pip install python-dotenv
修改JSON配置,使用${VAR_NAME}引用变量:
{
"production": {
"database": {
"password": "${DB_PASSWORD}"
}
}
}
加载配置并注入环境变量:
from dotenv import load_dotenv
import json
import os
# 1. 加载.env文件(存储敏感变量)
load_dotenv(dotenv_path=".env")
# 2. 读取JSON配置并替换变量
with open("config.json", "r") as f:
config = json.load(f)
env_config = config["production"]
for key, value in env_config.items():
if isinstance(value, str) and value.startswith("${") and value.endswith("}"):
var_name = value[2:-1]
env_config[key] = os.getenv(var_name) # 从.env或系统环境变量获取
print(env_config["database"]["password"]) # 输出: .env中的DB_PASSWORD值
(2)Node.js + dotenv
安装依赖:npm install dotenv
修改JSON配置,使用${VAR_NAME}引用变量:
{
"production": {
"database": {
"password": "${DB_PASSWORD}"
}
}
}
加载配置并注入环境变量:
require('dotenv').config(); // 加载.env文件
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
const envConfig = config.production;
// 替换变量
Object.keys(envConfig).forEach(key => {
if (typeof envConfig[key] === 'object') {
Object.keys(envConfig[key]).forEach(subKey => {
const value = envConfig[key][subKey];
if (typeof value === 'string' && value.startsWith('${') && value.endsWith('}')) {
const varName = value.substring(2, value.length - 1);
envConfig[key][subKey] = process.env[varName] || value;
}
});
}
});
console.log(envConfig.database.password); // 输出: .env中的DB_PASSWORD值
在CI/CD流程中通过JSON设置环境变量
在持续集成/持续部署(CI/CD)场景中,常需通过JSON文件批量设置环境变量(如GitHub Actions、Jenkins),以GitHub Actions为例:
(1)准备JSON配置文件
创建.github/envs/production.json:
{
"DATABASE_HOST": "prod-db.example.com",
"DATABASE_PORT": "3306",
"API_BASE_URL": "https://api.example.com",
"DEBUG": "false"
}
(2)在Workflow中加载JSON并设置环境变量
name: Deploy Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-l


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