当前位置: 首页 > news >正文

jsonnet介绍和使用

文章目录

  • Jsonnet介绍
    • 一、Jsonnet 的核心特点
    • 二、基本语法示例
      • 1. 变量与局部作用域
      • 2. 函数
      • 3. 条件表达式
      • 4. 对象继承与覆盖
      • 5. 数组与列表推导
    • 三、典型使用场景
      • ✅ 配置文件管理(如 Kubernetes、Terraform)
      • ✅ 生成结构化数据(JSON/YAML)
      • ✅ 构建复杂模板(如代码生成、SQL 模板)
    • 四、工具链与使用方式
      • 安装 Jsonnet
      • 命令行使用
      • 与构建系统集成
    • 五、进阶技巧
    • 六、学习资源
  • Jsonnet高级概念
    • 1. **文件包含(Import)**
    • 2. **注释(Comments)**
    • 3. **其他高级特性(简要)**
    • 4. **与 JSON 的兼容性**
    • 5. **典型使用场景**

Jsonnet介绍

Jsonnet 是一种领域特定语言(DSL),用于以结构化、可编程的方式生成JSON(以及兼容格式如 YAML、TOML)。它由 Google 开发,旨在解决纯 JSON 在配置管理、模板复用和逻辑表达方面的不足。


一、Jsonnet 的核心特点

  1. 基于 JSON 扩展:Jsonnet 可以看作“带逻辑的 JSON”——所有合法的 JSON 也是合法的 Jsonnet,但 Jsonnet 支持变量、函数、条件、继承、模块化等。
  2. 不可变数据结构:强调函数式编程风格,变量一旦赋值不可更改,避免副作用。
  3. 延迟求值(Lazy Evaluation):字段只有在被引用时才计算,提高效率并支持灵活的依赖关系。
  4. 强大的对象模型:支持对象继承(+:::+::等操作符)、隐藏字段(::为私有)、局部作用域(local)。
  5. 标准库丰富:内置std库,提供字符串处理、数组/对象操作、数学函数等。
  6. 可生成多种格式:通过工具可输出 JSON、YAML、甚至文本(如配置文件、SQL、代码模板等)。

二、基本语法示例

1. 变量与局部作用域

local name = "alice"; { user: name, id: 1001 }

2. 函数

local greeting(person) = "Hello, " + person + "!"; { message: greeting("Bob") }

3. 条件表达式

local env = "prod"; { db_url: if env == "prod" then "db.prod.example.com" else "db.dev.example.com" }

4. 对象继承与覆盖

local baseConfig = { port: 8080, timeout: 30, debug:: false // 私有字段,不会出现在最终 JSON 中 }; { dev: baseConfig { port: 8081, debug:: true } }

5. 数组与列表推导

local services = ["web", "api", "db"]; { containers: [ { name: s, image: s + ":latest" } for s in services ] }

三、典型使用场景

✅ 配置文件管理(如 Kubernetes、Terraform)

  • 避免重复配置(DRY)
  • 多环境(dev/staging/prod)复用同一模板
  • 示例:Tanka 就是基于 Jsonnet 的 Kubernetes 配置工具

✅ 生成结构化数据(JSON/YAML)

  • 用于 CI/CD、测试数据生成、API mock 等

✅ 构建复杂模板(如代码生成、SQL 模板)

  • 结合std.manifestJsonExstd.manifestYamlDoc等函数输出所需格式

四、工具链与使用方式

安装 Jsonnet

# macOS (Homebrew)brewinstalljsonnet# Linux (Debian/Ubuntu)sudoapt-getinstalljsonnet# 或从源码编译(Go 实现:go-jsonnet,性能更好)goinstallgithub.com/google/go-jsonnet/cmd/jsonnet@latest

命令行使用

# 生成 JSONjsonnet config.jsonnet# 生成 YAMLjsonnet --yaml-stream config.jsonnet# 格式化jsonnetfmt -i config.jsonnet

与构建系统集成

  • 可在 Makefile、Bazel、CMake(通过add_custom_command)中调用jsonnet生成配置

五、进阶技巧

  • 模块化:使用import "file.libsonnet"复用代码
  • 标准库std.map,std.filter,std.toString,std.base64,std.parseJson
  • 错误处理error "message"抛出错误
  • 字符串插值"Port is %d" % port
  • 输出非 JSON 文本:使用std.manifestText或自定义模板

示例:生成 YAML 配置

local cfg = { apiVersion: "v1", kind: "ConfigMap", metadata: { name: "app-config" }, data: { ENV: "production", LOG_LEVEL: "info" } }; std.manifestYamlDoc(cfg) // 注意:需用 `jsonnet --yaml-stream`

六、学习资源

  • 官网:https://jsonnet.org/
  • 交互式教程:https://jsonnet.org/learning/tutorial.html
  • 标准库文档:https://jsonnet.org/ref/stdlib.html
  • GitHub:https://github.com/google/jsonnet

Jsonnet高级概念

Jsonnet 是一种功能强大的结构化配置语言,它扩展了 JSON,提供了模块化、可重用性和表达能力,广泛用于配置管理、Kubernetes 清单生成等场景。以下是 Jsonnet 的几个高级概念,特别针对你关心的文件包含注释功能:


1.文件包含(Import)

Jsonnet 支持通过importimportstr机制包含其他文件,实现模块化和配置复用。

  • import "file.jsonnet"
    导入另一个 Jsonnet 文件,并将其求值结果作为表达式使用(通常是对象或函数)。

    // config.libsonnet { commonPort: 8080, server(name): { name: name, port: $.commonPort } } // main.jsonnet local lib = import "config.libsonnet"; { api: lib.server("api"), web: lib.server("web") }
  • importstr "file.txt"
    原始字符串形式导入文件内容(不解析为 Jsonnet),常用于嵌入模板、脚本或非结构化文本。

    local script = importstr "init.sh"; { initScript: script }

Jsonnet 的 import 路径是相对于当前文件的,也支持通过-J--jpath指定额外的搜索路径。


2.注释(Comments)

Jsonnet 完全支持类似 C/C++ 的注释语法:

  • 单行注释// This is a comment
  • 多行注释/* This is a multi-line comment */

这些注释在 Jsonnet 被编译为 JSON 后会自动被剥离,不会出现在输出中,因此不影响最终 JSON 的合法性。

{ // 服务端口配置 port: 8080, /* 启用调试模式? 仅在开发环境使用 */ debug: false }

⚠️ 注意:原始 JSON 不支持注释,但 Jsonnet 作为超集语言,允许在源码中使用注释,这是它优于纯 JSON 的一大优势。


3.其他高级特性(简要)

特性说明
函数(Functions)支持具名/匿名函数,实现参数化配置
继承与合并(+:、+: super)支持对象继承、字段覆盖、递归合并
条件表达式if/then/else可用于动态生成结构
列表/对象推导类似 Python 的列表推导式,用于生成复杂结构
标准库内置std库,提供字符串处理、数学、时间、YAML/JSON 转换等

4.与 JSON 的兼容性

  • 所有合法的 JSON 文件也是合法的 Jsonnet 文件(但反之不成立)。
  • Jsonnet 编译后输出标准 JSON,可被任何 JSON 工具消费。

5.典型使用场景

  • Kubernetes Helm 替代方案(如 Tanka)
  • 多环境配置管理(dev/staging/prod)
  • 大型系统中复用配置片段
http://www.jsqmd.com/news/79561/

相关文章:

  • Redis持久化机制详解:RDB和AOF对决,哪个更胜一筹?
  • JavaScript 与 WebAssembly 的零拷贝交互:使用共享线性内存(Linear Memory)实现超大数据传输
  • 考研408--组成原理--day7--指令扩展操作码寻址
  • C语言实现幂级数(附带源码)
  • GCC完全指南:从编译基础到高级项目构建(超详细)
  • JavaScript 全局对象 `globalThis` 的多环境统一:各引擎在实现跨环境引用时的设计权衡
  • JavaScript 的参数对象 `arguments` 与 命名参数的同步行为:在非严格模式下的内存陷阱
  • Flutter 通用弹窗组件 CustomDialogWidget:全自定义布局 + 多场景适配
  • 计算机科学与技术
  • 突破大模型推理瓶颈:阶跃星辰提出MFA机制,KV缓存降幅超93%且性能反升
  • Flutter 通用列表项组件 CommonListItemWidget:全场景布局 + 交互增强
  • 突破性图像编辑模型Qwen-Edit-2509 LoRa发布:实现精准镜头控制与多视角生成
  • XTOOL InPlus IK618 One-Year Update Service: Keep Your Diagnostics Current for European/American Cars
  • MiniCPM-Llama3-V 2.5震撼发布:重新定义多模态大模型性能边界
  • ContextMenuManager:5个立竿见影的技巧让Windows右键菜单飞起来
  • League Akari智能助手:英雄联盟玩家的游戏优化新选择
  • 视频生成效率革命:LightX2V团队发布LightVAE/TAE系列优化模型,平衡画质、速度与显存
  • [AI编程] ClaudeCode:智能体编程的最佳实践
  • 自建项目管理平台:用 Focalboard+cpolar 打破协作边界
  • 《数据库运维》 郭文明 实验1 MySQL数据库服务器配置核心操作与思路解析
  • 一文吃透API网关:核心功能详解
  • C语言递归函数的习题笔记
  • 文献综述写作期末指南:方法、结构与常见问题解析
  • JavaScript 与 硬件交互:利用 WebUSB/WebSerial API 处理二进制协议的状态机设计
  • 第53天(中等题 数据结构)
  • 如何快速掌握Scarab:空洞骑士模组管理的完整指南
  • Qwen3-8B-Base震撼发布:82亿参数如何颠覆大模型效率规则?【开源下载通道】
  • 腾讯混元开源突破性工具:HunyuanVideo-Foley实现电影级音效一键生成,多项指标刷新SOTA
  • 现场答题系统实际案例
  • 为什么优秀管理者更需要“摸鱼”?