news 2026/7/7 17:38:16

jsonnet介绍和使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)
  • 大型系统中复用配置片段
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 17:19:25

C语言递归函数的习题笔记

字符串逆序的递归实现(C语言)在C语言中,实现字符串逆序的递归方法是一种高效且直观的方式。递归的核心思想是将问题分解为更小的子问题:通过交换字符串的首尾字符,然后递归地处理剩余的子字符串,直到整个字…

作者头像 李华
网站建设 2026/7/1 13:59:41

Flutter 通用弹窗组件 CustomDialogWidget:全自定义布局 + 多场景适配

在 Flutter 开发中,弹窗是交互反馈、信息确认、选项选择的核心载体。原生 showDialog 存在样式固化、布局灵活度低、多按钮适配差等问题,重复开发易导致 APP 内弹窗风格混乱。本文封装的 CustomDialogWidget 整合 “头部 内容 按钮区” 全自定义、单选…

作者头像 李华
网站建设 2026/7/7 9:57:00

Flutter 通用列表项组件 CommonListItemWidget:全场景布局 + 交互增强

在 Flutter 开发中,列表是数据展示的核心载体,而列表项的样式统一性与灵活性直接影响开发效率与用户体验。原生 ListTile 存在图标位置固定、不支持徽章提示、自定义布局受限等问题。本文封装的 CommonListItemWidget 整合 “图标 / 图片 标题 副标题 …

作者头像 李华
网站建设 2026/7/6 2:07:24

论文目录工具排名:9大平台+自动格式调整

论文目录工具排名:9大平台自动格式调整 核心工具对比速览 工具名称 核心功能 处理速度 适用场景 特色优势 aibiye AI生成内容检测与降重 20分钟 学术论文降AIGC 知网/格子达/维普三平台适配 aicheck AI内容识别与优化 20分钟 混合AI内容处理 保留专业…

作者头像 李华
网站建设 2026/7/7 22:58:29

论文重复率超30%?5个降重技巧,一次降到合格线

论文重复率超30%?5个降重技巧,一次降到合格线 嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次…

作者头像 李华