存储配置数据(json)

Gab*_*mas 6 javascript node.js

tl; dr为什么在json文件中存储配置数据被认为是事实上的标准?

我最近阅读了可维护的Javascript书的一些部分,特别是存储配置数据章节.

这是本章的引用:

配置数据最好存储在单独的文件中,以便在它与应用程序逻辑之间创建一个干净的分离.一个很好的起点是为配置数据提供单独的JavaScript文件.一旦配置数据位于单独的文件中,它就为管理该数据提供了更多可能性.一个有价值的选择是将配置数据移动到非JavaScript文件中.

即使您正在编写JavaScript应用程序,JavaScript也不是存储配置数据的好方法.那是因为语法仍然是编程语言的语法,因此您需要确保没有引入语法错误.

他基本上说将配置数据存储在.json文件或.js文件中是一种不好的做法,应该避免.

来自json.org:

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.

交换意味着我发送和接收数据,以格式良好的方式传达两个进程.

很多人将数据存储在json文件中,这会增加很多噪音:花括号,缩进,双引号,逗号,无法写注释等.

Java使用键值行,是否有更简单的方法来存储这些数据?

a 1
Run Code Online (Sandbox Code Playgroud)

并使用json格式(1):

{
  "a": 1
}
Run Code Online (Sandbox Code Playgroud)

并使用js格式(2):

module.exports = {
  a: 1
}
Run Code Online (Sandbox Code Playgroud)

Microsoft喜欢使用.ini文件,这些文件会向这些键值行添加部分.

Unix配置文件也使用键值行.

然后,如果全世界都使用键值行,因为它们很容易被人类读/写,为什么json文件在node.js世界中是事实上的标准呢?请不要告诉我,因为json和javascript实际上是同义词,因为开发人员太懒了,而且更喜欢打电话require("./config.json").

在上面的例子中,第一个选项(1)的诞生是为了简化数据的可互换性.第二,imo,这很糟糕.这与在Java类中存储配置数据相同.如果我想从php读取这个文件,因为我有一个apache服务器和nodejs用于实时的东西,我应该如何解析该文件?我需要一个javascript解析器.

两个选项都不应该有语法错误,否则程序可能会崩溃.

Sam*_*rek 3

PS - 恕我直言,你对评论的看法是对的,使用没有评论的格式是很糟糕的

PPS - 我是 Javascript 开发人员,帖子上是 Javascript 标签 - 所以从这边主观地回答

为什么将配置数据存储在 JSON 中?

这很简单。在 JavaScript 中。由于 JSON 的格式与 JS 中的格式相同,因此服务器端对象、客户端对象和数据存储Object可以使用相同的语法。当你想要调试某些东西时,你可以抓取整个 JSON 并将其放入你的代码中var obj = JSON,然后它就可以工作了。您可以在http://www.json.org/ Crockford 的网站上找到更多信息。

为什么“很多噪音如大括号、标识、双引号......”很重要?

第一个原因当然是语法错误检测。如果您使用强大的语法而不是“纯键/对值”,您可以更快地检测到并且很容易丢失分号或大括号。还有一点非常重要——大文件的解析速度更快

第二个原因是数组、对象、字符串和布尔值的语法不同。您希望有字符串“true”、布尔值 true 和数字 true - 1 的选项,因为您希望使用许多数据库、存储、API、编程语言 - 您需要支持整个规模

标识和 JSON 关系不是问题。JSON 可以是单行的。在配置文件中这是非常不切实际的(stackoverflow的用户可以解析它;DDD,但“正常人”则不能)。

第三个原因是亲子关系。让我们看一个示例:

[
    {
        "email": "samuel@dude.com",
        "isAdmin" : true,
        "password": "KMLA#SLDOPW#",
        "modules" : [ "html", "js", "css" ],
        "creditcard" : {
            "number" : 3288942398329832,
            "expiration" : "2011-07-14T19:43:37+0100"
        }
    },
    {
        "email": "bill@dude.com",
        "isAdmin" : true,
        "password": "KMLA#SLDOPW#",
        "modules" : [ "js", "nodejs" ],
        "creditcard" : {
            "number" : 20432943092423,
            "expiration" : "2011-07-14T19:43:37+0100"
        }
    },
    {
        "email": "thomas@dude.com",
        "isAdmin" : false,
        "password": "KMLA#SLDOPW#",
        "modules" : [ "ruby", "python", "css" ],
        "creditcard" : {
            "number" : 4239093223423,
            "expiration" : "2011-07-14T19:43:37+0100"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

..您想将所有电子邮件记录到控制台吗?
jsonobj.forEach(function(ele){ console.log(ele.email); });

..您想访问第一个用户的信用卡号吗?
jsonobj[0].creditcard.number

..您想添加下一个用户吗? jsonobj.push({ email: "peter@dude.com:, isAdmin: false })

..您想在没有外部库的情况下解析文件吗? JSON.parse(jsonrawfile);

JSON 与 XML

非常相似的方法是使用 XML。但关于这个尝试谷歌一些差异。我认为前端开发人员就像粉丝 IE6 一样粉丝 XML。之所以会这样,还有更多原因。尝试谷歌一下。

希望它很有帮助。