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

请不要用 JSON 作为配置文件,使用JSON做配置文件的缺点

我最近关注到有的项目使用JSON作为配置文件。我觉得这不是个好主意。
这不是JSON的设计目的,因此也不是它擅长的。JSON旨在成为一种“轻量级数据交换格式”,并声称它“易于人类读写”和“易于机器解析和生成”。
作为一种数据交换格式,JSON是很好的。人类可以相对容易地读取和写入它,并且对于机器来说也很容易解析(尽管存在一些问题)。
这是机器可读和人类可读之间的一个很好的折衷,对于许多用例来说,它是对XML的一个很好的改进。
使用它用于其他目的有点类似于说“嘿,这个锤子工程真的很好驱动钉子!我爱死它了!为什么不用它把这个螺丝钉钉进去呢!“当然,它有点工作,但它不是工作的工具。


到目前为止,最大的问题是你不能在JSON中添加注释。偶尔的JSON解析器支持它,但大多数都不支持,而且它不在标准中。出于充分的理由,JSON中明确删除了注释支持。
有很多原因,您要添加注释:文档设置设置为值的原因、添加助记符或描述注意事项、警告过去的配置错误、在文件本身中保留基本的ChangeLog,或者只是在调试时注释掉一个部分/值。
一个建议的解决方法是使用新密钥(例如:{"comment": "a comment", "actual_data": "..."}),这让我觉得这样很实用。

还有人已经指出,你可以使用提交日志,但是谁会仔细阅读提交历史记录,如果有一些重要的信息隐藏在其中呢?
一些JSON方言(如JSON 5、Hjson和HOCON)添加了对注释的支持,一些JSON解析器也是如此。这很好,我鼓励你使用它,但它不再是JSON,而是JSON方言。这篇文章是关于JSON,而不是JSON方言。


我还发现JSON的UX对于手工编辑来说是次优的:你需要在后面加上逗号,引号的语义很烦人,而且它缺乏使用多行字符串的能力。这些属性对于JSON的预期用途来说很好,但对于编辑配置文件来说就不那么好了。可行吗?当然可以了。好玩吗?不,我不知道
我也不觉得它特别可读,因为它遭受了过多的引用和其他语法噪音,我坦率地承认这是一个品味问题。


JSON是一种声明性配置语言。声明性配置(DC)对某些问题很有效,但对其他问题就不那么有效了。特别是,使用DC来控制逻辑通常不是一个好主意。

促使我写这篇文章的是MediaWiki的新扩展系统。旧系统使用一个简单的PHP文件来连接核心MediaWiki代码,加载所需的依赖项等。这在新系统中被替换为JSON文件。这样做所失去的是在与其他插件或其他逻辑的兼容性方面聪明的能力。

它的实现也要复杂得多,以前它只是 require('plugin/foo/plugin.php'); ,现在它需要解析JSON文件并处理其中的内容。这要复杂得多,因此更难调试。

虽然使用JSON文件作为基本元数据是有意义的(更容易解析和显示在网站上),但使用它来描述代码的工作方式让我觉得这是对DC的滥用。毕竟,这就是代码的作用。


很多人问我该用什么。这不是一个容易回答的问题,因为它取决于您的用例、编程语言、库环境和社会因素。没有一个“正确的答案”,也许只有“最简单的,满足你所有要求”。我写了一篇关于这件事的文章。

一个好的替代方法可能是只使用命令行标志。

有一些JSON方言是专门为人类编辑设计的:JSON5、Hjson和HOCON。所有这些看起来都是常规JSON的合理提升,尽管我自己还没有使用过它们中的任何一个。JSON5似乎是一个很好的替代方案,因为它对JSON的更改最少。

我不太愿意提出其他的替代方案,因为我还没有对所有格式(除了YAML)做过深入的评估;仅仅浏览一下规范,潜在的缺点可能并不明显(YAML是一个很好的例子,有很多微妙的行为)。我真的没有时间-或兴趣-对所有的替代方案进行全面深入的审查。

相关文章:

请不要用 JSON 作为配置文件,使用JSON做配置文件的缺点

我最近关注到有的项目使用JSON作为配置文件。我觉得这不是个好主意。 这不是JSON的设计目的,因此也不是它擅长的。JSON旨在成为一种“轻量级数据交换格式”,并声称它“易于人类读写”和“易于机器解析和生成”。 作为一种数据交换格式,JSON是…...

Hadabot:从网络浏览器操作 ROS2 远程控制器

一、说明 Hadabot Hadabot是一个学习ROS2和机器人技术的机器人套件。使用 Hadabot,您将能够以最小的挫败感和恐吓来构建和编程物理 ROS2 机器人。Hadabot套件目前正在开发中。它将仅针对ROS2功能,并强调基于Web的用户界面。 随着开发的进展&a…...

Kotlin 协程

Kotlin 协程(Coroutines)是一种轻量级的并发编程解决方案,旨在简化异步操作和多线程编程。它提供了一种顺序和非阻塞的方式来处理并发任务,使得代码可以更加简洁和易于理解。Kotlin 协程通过提供一套高级 API,使并发代…...

maven 从官网下载指定版本

1. 进入官网下载页面 Maven – Download Apache Maven 点击下图所示链接 2. 进入文件页,选择需要的版本 3. 选binaries 4. 选文件,下载即可...

数据结构---串(赋值,求子串,比较,定位)

目录 一.初始化 顺序表中串的存储 串的链式存储 二.赋值操作:将str赋值给S 链式表 顺序表 三.复制操作:将chars复制到str中 链式表 顺序表 四.判空操作 链式表 顺序表 五.清空操作 六.串联结 链式表 顺序表 七.求子串 链式表 顺序表…...

WPF CommunityToolkit.Mvvm

文章目录 前言ToolkitNuget安装简单使用SetProperty,通知更新RealyCommandCanExecute 新功能,代码生成器ObservablePropertyNotifyCanExecuteChangedForRelayCommand其他功能对应关系 NotifyPropertyChangedFor 前言 CommunityToolkit.Mvvm(…...

Vue开发中如何解决国际化语言切换问题

Vue开发中如何解决国际化语言切换问题 引言: 在如今的全球化时代,应用程序的国际化变得越来越重要。为了让不同地区的用户能够更好地使用应用程序,我们需要对内容进行本地化,以适应不同语言和文化环境。对于使用Vue进行开发的应用…...

基于springboot+vue的流动人口登记系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Stable Diffusion的使用以及各种资源

Stable Diffsuion资源目录 SD简述sd安装模型下载关键词,描述语句插件管理controlNet自己训练模型 SD简述 Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如…...

Redis 分布式锁的实现方式

一般来说,在对数据进行“加锁”时,程序首先需要通过获取(acquire)锁来得到对数据排他性访问的能力,然后才能对数据执行一系列操作,最后还要将锁释放(release)给其他程序。 对于能够…...

VMware上搭建的虚拟机突然本地无法连接服务器

长时间没有使用VMware 虚拟机了,今天突然登录上去,启动虚拟服务器后发现本地等不了了, 经过排查发现是开启了:VirtualBox Host-Only Network 关闭之后就本机就可以直连服务器了...

JDBC回顾

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 JDBC回顾 前言一、JDBC1.JDBC是什么?2.如何使用?(1)注册驱动(2)获取连接(3)操作…...

mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ

省流: 十几年前,淘宝的notify,借鉴ActiveMQ。京东的ActiveMQ集群几百台,后面改成JMQ。 Linkedin的kafka,因为是scala,国内很多人不熟。淘宝的人把kafka用java写了一遍,取名metaq,后…...

沃尔玛卖家必看!解决订单被Kan、Feng号问题的终极方案!

近期有很多沃尔玛卖家和工作室联系到我提到说在沃尔玛平台上下单,买家号出现副款义常订单被k掉,是什么原因、我们该如何去解决呢? 以下是一些可能导至你的测评订单被k单的原因: 1.技术问题:有时,网站或系…...

浅谈日常使用的 Docker 底层原理-三大底座

适合的读者,对Docker有过简单了解的朋友,想要进一步了解Docker容器的朋友。 前言 回想我这两年,一直都是在使用 Docker,看过的视频、拜读过的博客,大都是在介绍 Docker 的由来、使用、优点和发展趋势,但对…...

前端面试:【DOM】编织网页的魔法

嘿,亲爱的代码魔法师!在JavaScript的奇幻世界里,有一项强大的技能,那就是DOM操作。DOM(文档对象模型)操作允许你选择、修改和创建网页元素,就像是在编织一个魔法的网页。 1. 什么是DOM&#xff…...

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 2 Inport和Outports 标签页介绍

上篇我们介绍了Function页的内容,这篇我们介绍Inports和Outports页的内容,这里我们再次强调一个概念,code mapping是以simulink的角度去看的,就是先要在模型中建立simulink模块,在code mapping里映射他要对应的autosar的元素,之后生成代码时的c语言的名字是以Autosar的元…...

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 btree树…...

Numpy入门(3)—线性代数

线性代数 线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分,NumPy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。本节主要介绍如下函数: diag&am…...

php的openssl_encrypt是不是自动做了PKCS5Padding?

在PHP中,openssl_encrypt函数默认使用的是PKCS7填充(不是PKCS5填充)。PKCS7填充实际上是PKCS5填充的扩展,用于对不同块大小的数据进行填充。 当你使用openssl_encrypt函数进行加密时,如果你没有显式指定填充模式和填充…...

MySQL 比较规则(Collation)详解

一、概述 比较规则(Collation) 是一组定义如何比较和排序字符集中字符的规则。它决定了: 字符串的大小写是否敏感(A a?)重音符号是否敏感( e?)多语言字符的排序顺序&…...

滑动窗口(数组)

作用滑动窗口&#xff1a;求连续满足条件的最短子数组代码模板int left 0; int right;//外层循环扩展右边界&#xff0c;内层循环扩展左边界 for (right 0; right < n; right) {//获取当前考虑的元素while (left < right && check()) {//区间[left,right]不符合…...

从零掌握生成式AI:开源学习路径与实战项目全解析

1. 项目概述与核心价值最近在GitHub上看到一个名为“panaverse/learn-generative-ai”的项目&#xff0c;作为一个在AI领域摸爬滚打多年的从业者&#xff0c;我立刻被它吸引住了。这个项目直译过来就是“学习生成式AI”&#xff0c;名字非常直接&#xff0c;但它的内容组织和深…...

AI舞蹈生成实战:从扩散模型原理到seedance-2.0部署与调优

1. 项目概述&#xff1a;从种子到舞蹈的AI生成革命最近在AI生成领域&#xff0c;一个名为“seedance-2.0”的项目引起了我的注意。这个项目名本身就很有意思&#xff0c;“seedance”可以拆解为“seed”&#xff08;种子&#xff09;和“dance”&#xff08;舞蹈&#xff09;&a…...

工业传动避坑:3 个皮带张力调节技巧,杜绝早期失效

工业传动避坑&#xff1a;3 个皮带张力调节技巧&#xff0c;杜绝早期失效在工业传动系统运维中&#xff0c;盖茨同步带、工业皮带的早期失效是高频痛点——不少工程师频繁更换皮带&#xff0c;却始终无法解决根本问题&#xff0c;反而增加运维成本。事实上&#xff0c;90%以上的…...

基于RAG架构的企业级AI知识库:从原理到部署实战

1. 项目概述&#xff1a;一个AI驱动的企业级知识管理新范式最近在探索企业知识库与AI结合的实际落地方案时&#xff0c;我注意到了GitHub上一个名为akshata29/entaoai的项目。这个项目名称本身就是一个很好的线索&#xff1a;“entao” 很容易让人联想到 “Enterprise AI”&…...

混沌工程实战:使用Roast平台提升分布式系统韧性

1. 项目概述&#xff1a;从“烤”代码到“烤”出高质量最近在跟几个做后端开发的朋友聊天&#xff0c;大家普遍有个痛点&#xff1a;项目迭代快了&#xff0c;代码质量就容易滑坡。单元测试覆盖率看着还行&#xff0c;但一上线&#xff0c;各种稀奇古怪的线上问题就冒出来了&am…...

AI模型API网关:统一管理多厂商大模型调用,实现高效治理与成本控制

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;发现一个挺普遍的问题&#xff1a;当你的应用需要同时调用多个不同厂商的大模型API时&#xff0c;管理起来简直是一场噩梦。每个厂商的接口地址、认证方式、请求格式、计费逻辑都不一样&#xff0c;更别提还有速率限制、…...

Claude技能构建指南|第五章 模式与故障排除(Patterns and Troubleshooting)

Claude技能构建指南&#xff5c;第五章 模式与故障排除&#xff08;Patterns and Troubleshooting&#xff09; 1. ① 本章核心主旨 本章提供5种高频复用的技能设计模式&#xff0c;并针对上传、触发、执行、MCP连接等常见问题给出标准化排查方案&#xff0c;学完可直接套用成熟…...

渗透测试之信息收集:这些技巧决定了渗透成败

渗透测试之信息收集&#xff1a;这些技巧决定了渗透成败作者&#xff1a;浅木先生前言 做渗透测试久了&#xff0c;你会越来越认同一个观点&#xff1a;信息收集的质量直接决定渗透测试的成败。 同样的目标URL&#xff0c;不同人扫出来的结果完全不同——有人只能扫出后台登录页…...