蚊章汇 - JSON
type: channel
link: https://linuxcn.bwsl.wang/tag/JSON/
items: 硬核观察 #1220 OpenAI 探索用较低级的 AI 来监管更高级的 AI
items: 用 Groovy 解析 JSON 配置文件
items: 如何在 Linux 终端上漂亮地打印 JSON 文件
items: 如何使用 Protobuf 做数据交换
items: 如何用 Linux 命令行工具解析和格式化输出 JSON
items: 使用 Python 处理 JSON 格式的数据
items: JSON、XML、TOML、CSON、YAML 大比拼
items: XML 与 JSON 优劣对比
items: JSON 的兴起与崛起
items: 不像 MySQL 的 MySQL：MySQL 文档存储介绍

硬核观察 #1220 OpenAI 探索用较低级的 AI 来监管更高级的 AI
type: item
date: 2023-12-19T08:14:07+08:00
description: 1 OpenAI 探索用较低级的 AI 来监管更高级的 AIOpenAI 的团队介绍了一种让功能较弱的大型语言模型（LLM）监督功能较强的 LLM 的技术，并表示，这可能是朝着弄清人类如何监督超人机器迈出的一小步。OpenAI 团队认为，机器的最终优势是必然的，“我们一直在碾压所有的基准，而且这种进步有增无减”。他们没有研究人类如何监督超人机器，而是研究了用其五年前发布的模型 GPT-2 如何监督最新、最强大的模型 GPT-4。“如果你能做到这一点，那就证明你可以使用类似的技术让人类监督超过人类的模型……结果喜忧参半”。他们的结论是，这种方法很有前途，但还需要更多的努力。（插图：DA/fc35d211-8080-400d-b6f9-0e6a5bd31cf3）消息来源：MIT 科技评论老王点评：这就是用一个比较“愚忠”的 AI 来监管那些“桀骜不驯”的 AI 吗？2 微软发布小型 LLM Phi-2，性能超越更大的 Llama 2Phi-2 拥有 27 亿个参数，其性能可与其他更大的模型相媲美，包括拥有 70 亿个参数的 Meta 的 Llama 2-7B，以及另一个也拥有 70 亿个参数的模型 Mistral-7B。微软称，尽管 Phi-2 比谷歌全新的 Gemini Nano 2 模型多了 5 亿个参数，但其性能却优于后者，而且其响应的 “毒性” 和偏差也小于 Llama 2。不过目前，微软限制 Phi-2 只能用于 “研究目的”，而不能用于商业用途。（插图：DA/71166394-aa5d-4ed1-b10f-aeff651173cf）消息来源：Venture Beat老王点评：相信随着研究的进展，以后运行在手机上或边缘设备上的超级 AI 将不再遥远。3 JSON 的创造者发布新编程语言 Misty创造了 JSON 符号的 道格·克罗克福德 Doug Crockford 又创造了一种“既适合学生使用，也适合专业程序员使用”的新的编程语言。该语言称其为 “一种动态的、通用的、过渡性的演员语言。它的语法温和，旨在为学生提供帮助，同时还具有一些高级特性，如能力安全和具有词法范围的 Lambda。”有趣的是，为了避免因缩进不同而导致的争论，Misty 只允许一种约定：缩进是 4 个空格。（插图：DA/9bb516c9-62a0-40a8-826c-5407a4a5ea82）消息来源：Doug Crockford老王点评：一种新的 BASIC 语言吗？

用 Groovy 解析 JSON 配置文件
type: item
date: 2021-07-13T07:24:38+08:00
description: 抛开关于是否使用 JSON 作为配置格式的争论，只需学习如何用 Groovy 来解析它。应用程序通常包括某种类型的默认或“开箱即用”的状态或配置，以及某种让用户根据自己的需要定制配置的方式。例如，LibreOffice Writer 通过其菜单栏上的工具 > 选项，可以访问诸如用户数据、字体、语言设置等（以及更多的）设置。一些应用程序（如 LibreOffice）提供了一个点选式的用户界面来管理这些设置。有些，像 Tracker（GNOME 的“任务”，用于索引文件）使用 XML 文件。还有一些，特别是基于 JavaScript 的应用，使用 JSON，尽管它有许多人抗议（例如，这位作者 和 这位其他作者）。在这篇文章中，我将回避关于是否使用 JSON 作为配置文件格式的争论，并解释如何使用 Groovy 编程语言 来解析这类信息。Groovy 以 Java 为基础，但有一套不同的设计重点，使 Groovy 感觉更像 Python。安装 Groovy由于 Groovy 是基于 Java 的，它也需要安装 Java。你可能会在你的 Linux 发行版的软件库中找到最近的、合适的 Java 和 Groovy 版本。或者，你可以按照其网站上的 说明 安装 Groovy。 Linux 用户的一个不错的选择是 SDKMan，你可以使用它来获取 Java、Groovy 和许多其他相关工具的多个版本。 对于本文，我将使用我的发行版的 OpenJDK11 和 SDKMan 的 Groovy 3.0.7。演示的 JSON 配置文件在这个演示中，我从 Drupal 中截取了这个 JSON 文件，它是 Drupal CMS 使用的主要配置文件，并将其保存在文件 config.json 中：{ "vm": { "ip": "192.168.44.44", "memory": "1024", "synced_folders": [ { "host_path": "data/", "guest_path": "/var/www", "type": "default" } ], "forwarded_ports": [] }, "vdd": { "sites": { "drupal8": { "account_name": "root", "account_pass": "root", "account_mail": "box@example.com", "site_name": "Drupal 8", "site_mail": "box@example.com", "vhost": { "document_root": "drupal8", "url": "drupal8.dev", "alias": ["www.drupal8.dev"] } }, "drupal7": { "account_name": "root", "account_pass": "root", "account_mail": "box@example.com", "site_name": "Drupal 7", "site_mail": "box@example.com", "vhost": { "document_root": "drupal7", "url": "drupal7.dev", "alias": ["www.drupal7.dev"] } } } } } 这是一个漂亮的、复杂的 JSON 文件，有几层结构，如：<>.vdd.sites.drupal8.account_name 和一些列表，如：<>.vm.synced_folders 这里，<> 代表未命名的顶层。让我们看看 Groovy 是如何处理的。用 Groovy 解析 JSONGroovy 自带的 groovy.json 包，里面有各种很酷的东西。其中最好的部分是 JsonSlurper 类，它包括几个 parse() 方法，可以将 JSON 转换为 Groovy 的 Map，一种根据键值存储的数据结构。下面是一个简短的 Groovy 程序，名为 config1.groovy，它创建了一个 JsonSlurper 实例，然后调用其中的 parse() 方法来解析文件中的 JSON，并将其转换名为 config 的 Map 实例，最后将该 map 输出：import groovy.json.JsonSlurper def jsonSlurper = new JsonSlurper() def config = jsonSlurper.parse(new File('config.json')) println "config = $config" 在终端的命令行上运行这个程序：$ groovy config…

如何在 Linux 终端上漂亮地打印 JSON 文件
type: item
date: 2020-12-13T20:24:30+08:00
description: JSON 文件非常棒，因为它们以人类可读的格式存储数据集合。然而，如果 JSON 文件被最小化过，那么阅读 JSON 文件可能会很痛苦。以这个为例：计算机可以很容易地读取它。即使是人也能读，但如果 JSON 文件以合适的格式显示，那么阅读就会简单很多。我的意思是 JSON 文件应该是这样读的：你可以使用大多数的文本编辑器和一些插件以合适的格式显示它。然而，如果你在终端中，或者你想在你的 shell 脚本中这么做，事情会有所不同。如果你有一个已最小化过的 JSON 文件，让我来告诉你如何在 Linux 终端中漂亮地输出它。在 Linux 中用 jq 命令漂亮地打印 JSON 文件jq 是一个命令行 JSON 处理器。你可以用它来切分、过滤、映射和转换结构化数据。我在这里不打算详细介绍 jq 命令行工具的使用。要使用 jq，你需要先安装它。你可以使用你的发行版的包管理器来安装它。如果启用了 universe 仓库，你可以使用 apt 命令在 Ubuntu 上安装它：sudo apt install jq 安装好后，用下面的方法在显示屏上漂亮地打印 JSON 文件：jq . sample.json 你可能也想用 cat，但我认为 cat 在这里没用。cat sample.json | jq 请记住，上述命令不会影响原始 JSON 文件。不会向它写入任何更改。你可能已经知道如何在 Linux 中把命令输出重定向到一个文件。你可能也知道不能重定向到同一个文件，而且 tee 命令也不能保证一直有效。如果你想用漂亮的格式修改原来的 JSON 文件，可以把解析后的输出结果用管道传送到一个新的文件中，然后覆盖原来的 JSON 文件。jq . sample.json > pretty.json 额外技巧：用 jq 命令对 JSON 文件最小化。让我们反过来，对一个格式良好的 JSON 文件进行最小化。要最小化 JSON 文件，你可以使用选项 -c。jq -c < pretty.json 如果你愿意，你也可以使用 cat 和重定向：cat pretty.json | jq -c 在 Linux 中使用 Python 来漂亮地打印 JSON 文件你更有可能是在系统中安装了 Python。如果是这样的话，你可以用它在终端漂亮地打印 JSON 文件：python3 -m json.tool sample.json 我知道还有其他方法可以解析 JSON 文件并以适当的格式打印出来。你可以自己去探索，但这两种方法足以完成漂亮地打印 JSON 文件的工作。via: https://itsfoss.com/pretty-print-json-linux/作者：Abhishek Prakash 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何使用 Protobuf 做数据交换
type: item
date: 2019-11-22T15:59:06+08:00
description: 在以不同语言编写并在不同平台上运行的应用程序之间交换数据时，Protobuf 编码可提高效率。 协议缓冲区 Protocol Buffers （Protobufs）像 XML 和 JSON 一样，可以让用不同语言编写并在不同平台上运行的应用程序交换数据。例如，用 Go 编写的发送程序可以在 Protobuf 中对以 Go 表示的销售订单数据进行编码，然后用 Java 编写的接收方可以对它进行解码，以获取所接收订单数据的 Java 表示方式。这是在网络连接上的结构示意图：Go 销售订单 —> Pbuf 编码 —> 网络 —> Pbuf 界面 —> Java 销售订单与 XML 和 JSON 相比，Protobuf 编码是二进制而不是文本，这会使调试复杂化。但是，正如本文中的代码示例所确认的那样，Protobuf 编码在大小上比 XML 或 JSON 编码要有效得多。Protobuf 以另一种方式提供了这种有效性。在实现级别，Protobuf 和其他编码系统对结构化数据进行 序列化 serialize 和 反序列化 deserialize 。序列化将特定语言的数据结构转换为字节流，反序列化是将字节流转换回特定语言的数据结构的逆运算。序列化和反序列化可能成为数据交换的瓶颈，因为这些操作会占用大量 CPU。高效的序列化和反序列化是 Protobuf 的另一个设计目标。最近的编码技术，例如 Protobuf 和 FlatBuffers，源自 1990 年代初期的 DCE/RPC（ 分布式计算环境/远程过程调用 Distributed Computing Environment/Remote Procedure Call ）计划。与 DCE/RPC 一样，Protobuf 在数据交换中为 IDL（接口定义语言）和编码层做出了贡献。本文将着眼于这两层，然后提供 Go 和 Java 中的代码示例以充实 Protobuf 的细节，并表明 Protobuf 是易于使用的。Protobuf 作为一个 IDL 和编码层像 Protobuf 一样，DCE/RPC 被设计为与语言和平台无关。适当的库和实用程序允许任何语言和平台用于 DCE/RPC 领域。此外，DCE/RPC 体系结构非常优雅。IDL 文档是一侧的远程过程与另一侧的调用者之间的协定。Protobuf 也是以 IDL 文档为中心的。IDL 文档是文本，在 DCE/RPC 中，使用基本 C 语法以及元数据的语法扩展（方括号）和一些新的关键字，例如 interface。这是一个例子：[uuid (2d6ead46-05e3-11ca-7dd1-426909beabcd), version(1.0)] interface echo { const long int ECHO_SIZE = 512; void echo( [in] handle_t h, [in, string] idl_char from_client[ ], [out, string] idl_char from_service[ECHO_SIZE] ); }该 IDL 文档声明了一个名为 echo 的过程，该过程带有三个参数：类型为 handle_t（实现指针）和 idl_char（ASCII 字符数组）的 [in] 参数被传递给远程过程，而 [out] 参数（也是一个字符串）从该过程中传回。在此示例中，echo 过程不会显式返回值（echo 左侧的 void），但也可以返回值。返回值，以及一个或多个 [out] 参数，允许远程过程任意返回许多值。下一节将介绍 Protobuf IDL，它的语法不同，但同样用作数据交换中的协定。DCE/RPC 和 Protobuf 中的 IDL 文档是创建用于交换数据的基础结构代码的实用程序的输入：IDL 文档 —> DCE/PRC 或 Protobuf 实用程序 —> 数据交换的支持代码作为相对简单的文本，IDL 是同样便于人类阅读的关于数据交换细节的文档（特别是交换的数据项的数量和每个项的数据类型）。Protobuf 可用于现代 RPC 系统，例如 gRPC；但是 Protobuf 本身仅提供 IDL 层和编码层，用于从发送者传递到接收者的消息。与原本的 DCE/RPC 一样，Protobuf 编码是二进制的，但效率更高。目前，XML 和 JSON 编码仍在通过 Web 服务等技术进行的数据交换中占主导地位，这些技术利用 Web 服务器、传输协议（例如 TCP、HTTP）以及标准库和实用程序等原有的基础设施来处理 XML 和 JSON 文档。 此外，各种类型的数据库系统可以存储 XML 和 JSON 文档，甚至旧式关系型系统也可以轻松生成查询结果的 XML 编码。现在，每种通用编程语言都具…

如何用 Linux 命令行工具解析和格式化输出 JSON
type: item
date: 2019-08-08T06:57:16+08:00
description: JSON 是一种轻量级且与语言无关的数据存储格式，易于与大多数编程语言集成，也易于人类理解 —— 当然，如果格式正确的话。JSON 这个词代表 Java Script Object Notation，虽然它以 JavaScript 开头，而且主要用于在服务器和浏览器之间交换数据，但现在正在用于许多领域，包括嵌入式系统。在这里，我们将使用 Linux 上的命令行工具解析并格式化打印 JSON。它对于在 shell 脚本中处理大型 JSON 数据或在 shell 脚本中处理 JSON 数据非常有用。什么是格式化输出？JSON 数据的结构更具人性化。但是在大多数情况下，JSON 数据会存储在一行中，甚至没有行结束字符。显然，这对于手动阅读和编辑不太方便。这是 格式化输出 pretty print 就很有用。这个该名称不言自明：重新格式化 JSON 文本，使人们读起来更清晰。这被称为 JSON 格式化输出。用 Linux 命令行工具解析和格式化输出 JSON可以使用命令行文本处理器解析 JSON 数据，例如 awk、sed 和 gerp。实际上 JSON.awk 是一个来做这个的 awk 脚本。但是，也有一些专用工具可用于同一目的。jq 或 jshon，shell 下的 JSON 解析器，它们都非常有用。Shell 脚本，如 JSON.sh 或 jsonv.sh，用于在 bash、zsh 或 dash shell 中解析JSON。JSON.awk，JSON 解析器 awk 脚本。像 json.tool 这样的 Python 模块。undercore-cli，基于 Node.js 和 javascript。在本教程中，我只关注 jq，这是一个 shell 下的非常强大的 JSON 解析器，具有高级过滤和脚本编程功能。JSON 格式化输出JSON 数据可能放在一行上使人难以解读，因此为了使其具有一定的可读性，JSON 格式化输出就可用于此目的的。示例：来自 jsonip.com 的数据，使用 curl 或 wget 工具获得 JSON 格式的外部 IP 地址，如下所示。$ wget -cq http://jsonip.com/ -O -实际数据看起来类似这样：{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}现在使用 jq 格式化输出它：$ wget -cq http://jsonip.com/ -O - | jq '.'通过 jq 过滤了该结果之后，它应该看起来类似这样：{ "ip": "111.222.333.444", "about": "/about", "Pro!": "http://getjsonip.com" }同样也可以通过 Python json.tool 模块做到。示例如下：$ cat anything.json | python -m json.tool这种基于 Python 的解决方案对于大多数用户来说应该没问题，但是如果没有预安装或无法安装 Python 则不行，比如在嵌入式系统上。然而，json.tool Python 模块具有明显的优势，它是跨平台的。因此，你可以在 Windows、Linux 或 Mac OS 上无缝使用它。如何用 jq 解析 JSON首先，你需要安装 jq，它已被大多数 GNU/Linux 发行版选中，并使用各自的软件包安装程序命令进行安装。在 Arch Linux 上：$ sudo pacman -S jq在 Debian、Ubuntu、Linux Mint 上：$ sudo apt-get install jq在 Fedora 上：$ sudo dnf install jq在 openSUSE 上：$ sudo zypper install jq对于其它操作系统或平台参见官方的安装指导。jq 的基本过滤和标识符功能jq 可以从 STDIN 或文件中读取 JSON 数据。你可以根据情况使用。单个符号 . 是最基本的过滤器。这些过滤器也称为对象标识符-索引。jq 使用单个 . 过滤器基本上相当将输入的 JSON 文件格式化输出。单引号：不必始终使用单引号。但是如果你在一行中组合几个过滤器，那么你必须使用它们。双引号：你必须用两个双引号括起任何特殊字符，如 @、＃、$，例如 jq .foo.”@bar”。原始数据打印：不管出于任何原因，如果你只需要最终解析的数据（不包含在双引号内），请使用带有 -r 标志的 jq 命令，如下所示：jq -r .foo.bar。解析特定数据要过滤出 JSON 的特定部分，你需要了解格式化输出的 JSON 文件的数据层次结构。来自维基百科的 JSON 数据示例：{ "fi…

使用 Python 处理 JSON 格式的数据
type: item
date: 2019-07-22T07:57:32+08:00
description: 如果你不希望从头开始创造一种数据格式来存放数据，JSON 是一个很好的选择。如果你对 Python 有所了解，就更加事半功倍了。下面就来介绍一下如何使用 Python 处理 JSON 数据。JSON 的全称是 JavaScript 对象表示法 JavaScript Object Notation 。这是一种以键值对的形式存储数据的格式，并且很容易解析，因而成为了一种被广泛使用的数据格式。另外，不要因为 JSON 名称而望文生义，JSON 并不仅仅在 JavaScript 中使用，它也可以在其它语言中使用。下文会介绍它是如何在 Python 中使用的。首先我们给出一个 JSON 示例：{ "name":"tux", "health":"23", "level":"4" }上面是一个和编程语言无关的原生 JSON 数据。熟悉 Python 的人会看出来这个 JSON 数据跟 Python 中的 字典 dictionary 长得很像。而这两者之间确实非常相似，如果你对 Python 中的列表和字典数据结构有一定的理解，那么 JSON 理解起来也不难。使用字典存放数据如果你的应用需要存储一些结构复杂的数据，不妨考虑使用 JSON 格式。对比你可能曾经用过的自定义格式的文本配置文件，JSON 提供了更加结构化的可递归的存储格式。同时，Python 自带的 json 模块已经提供了可以将 JSON 数据导入/导出应用时所需的所有解析库。因此，你不需要针对 JSON 自行编写代码进行解析，而其他开发人员在与你的应用进行数据交互的时候也不需要去解析新的数据格式。正是这个原因，JSON 在数据交换时被广泛地采用了。以下是一段在 Python 中使用嵌套字典的代码：#!/usr/bin/env python3 import json # instantiate an empty dict team = {} # add a team member team['tux'] = {'health': 23, 'level': 4} team['beastie'] = {'health': 13, 'level': 6} team['konqi'] = {'health': 18, 'level': 7}这段代码声明了一个名为 team 的字典，并初始化为一个空字典。如果要给这个字典添加内容，首先需要创建一个键，例如上面示例中的 tux、beastie、konqi，然后为这些键一一提供对应的值。上面示例中的值由一个个包含游戏玩家信息的字典充当。字典是一种可变的变量。字典中的数据可以随时添加、删除或更新。这样的特性使得字典成为了应用程序存储数据的极好选择。使用 JSON 格式存储数据如果存放在字典中的数据需要持久存储，这些数据就需要写到文件当中。这个时候就需要用到 Python 中的 json 模块了：with open('mydata.json', 'w') as f: json.dump(team, f)上面的代码首先创建了一个名为 mydata.json 的文件，然后以写模式打开了这个文件，这个被打开的文件以变量 f 表示（当然也可以用任何你喜欢的名称，例如 file、output 等）。而 json 模块中的 dump() 方法则是用于将一个字典输出到一个文件中。从应用中导出数据就是这么简单，同时这些导出的数据是结构化的、可理解的。现在可以查看导出的数据：$ cat mydata.json {"tux": {"health": 23, "level": 4}, "beastie": {"health": 13, "level": 6}, "konqi": {"health": 18, "level": 7}}从 JSON 文件中读取数据如果已经将数据以 JSON 格式导出到文件中了，也有可能需要将这些数据读回到应用中去。这个时候，可以使用 Python json 模块中的 load() 方法：#!/usr/bin/env python3 import json f = open('mydata.json') team = json.load(f) print(team['tux']) print(team['tux']['health']) print(team['tux']['level']) print(team['beastie']) print(team['beastie']['health']) print(team['beastie']['level']) # when finished, close the file f.close()这个方法实现了和保存文件大致相反的操作。使用一个变量 f 来表示打开了的文件，然后使用 json …

JSON、XML、TOML、CSON、YAML 大比拼
type: item
date: 2019-03-29T09:15:04+08:00
description: 一段超级严肃的关于样本序列化的集合、子集和超集的文字我是一名开发者，我读代码，我写代码，我写会写代码的代码，我写会写出供其它代码读的代码的代码。这些都非常火星语，但是有其美妙之处。然而，最后一点，写会写出供其它代码读的代码的代码，可以很快变得比这段文字更费解。有很多方法可以做到这一点。一种不那么复杂而且开发者社区最爱的方式是数据序列化。对于那些不了解我刚刚抛给你的时髦词的人，数据序列化是从一个系统获取一些信息，将其转换为其它系统可以读取的格式，然后将其传递给其它系统的过程。虽然数据序列化格式多到可以埋葬哈利法塔，但它们大多分为两类：易于人类读写，易于机器读写。很难两全其美，因为人类喜欢让我们更具表现力的松散类型和灵活格式标准，而机器倾向于被确切告知一切事情而没有二义性和细节缺失，并且认为“严格规范”才是它们最爱的口味。由于我是一名 web 开发者，而且我们是一个创建网站的机构，我们将坚持使用 web 系统可以理解或不需要太多努力就能理解的特殊格式，而且对人类可读性特别有用的格式：XML、JSON、TOML、CSON 以及 YAML。每个都有各自的优缺点和适当的用例场景。事实最先回到互联网的早期，一些非常聪明的家伙决定整合一种让每个系统都能理解的标准语言，并创造性地将其命名为 标准通用标记语言 Standard Generalized Markup Language （简称 SGML）。SGML 非常灵活，发布者也很好地定义了它。它成为了 XML、SVG 和 HTML 等语言之父。所有这三个都符合 SGML 规范，可是它们都是规则更严格、灵活性更少的子集。最终，人们开始看到非常小、简洁、易读且易于生成的数据的好处，这些数据可以在系统之间以编程的方式共享，而开销很小。大约在那个时候，JSON 诞生了并且能够满足所有的需求。而另一方面，其它语言也开始出现以处理更多的专业用例，如 CSON，TOML 和 YAML。XML：不行了原本，XML 语言非常灵活且易于编写，但它的缺点是冗长，人类难以阅读、计算机非常难以读取，并且有很多语法对于传达信息并不是完全必要的。今天，它在 web 上的数据序列化的用途已经消失了。除非你在编写 HTML 或者 SVG，否则你不太能在许多其它地方看到 XML。一些过时的系统今天仍在使用它，但是用它传递数据往往太重了。我已经可以听到 XML 老爷爷开始在它们的石碑上乱写为什么 XML 是了不起的，所以我将提供一个小小的补充：XML 可以很容易地由系统和人读写。然而，真的，我的意思是荒谬的，很难创建一个可以规范的读取它的系统。这是一个简单美观的 XML 示例：<book id="bk101"> <author>Gambardella, Matthew</author> XML Developer's Guide <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book>太棒了。易于阅读、理解、写入，也容易编码一个可以读写它的系统。但请考虑这个例子：<!DOCTYPE r [ <!ENTITY y "a]>b"> ]> <r> " /> [a>b b <a <?x <!-- ?> c --> d </r>这上面是 100% 有效的 XML。几乎不可能阅读、理解或推理。编写可以使用和理解这个的代码将花费至少 36 根头发和 248 磅咖啡渣。我们没有那么多时间或咖啡，而且我们大多数老程序员们现在都是秃头。所以，让它活在我们的记忆里，就像 css hacks、IE 6 浏览器 和真空管一样好了。JSON：并列聚会好吧，我们都同意，XML = 差劲。那么，好的替代品是什么？ JavaScript 对象表示法 JavaScript Object Notation ，简称 JSON。JSON（读起来像 Jason 这个名字） 是 Brendan Eich 发明的，并且得到了伟大而强力的 JavaScript 意见领袖 Douglas Crockford 的推广。它现在几乎用在任何地方。这种格式很容易由人和机器编写，按规范中的严格规则解析也相当容易，并且灵活 —— 允许深层嵌套数据，支持所有的原始数据类型，及将集合解释为数组或对象。JSON 成为了将数据从一个系统传输到另一个系统的事实标准。几乎所有语言都有内置读写它的功能。JSON语法很简单。方括号表示数组，花括号表示记录，由冒号分隔的两个值分别表示属性或“键”（在左边）、值（在右边）。所有键必…

XML 与 JSON 优劣对比
type: item
date: 2019-02-07T06:39:59+08:00
description: 简介XML 和 JSON 是现今互联网中最常用的两种数据交换格式。XML 格式由 W3C 于 1996 年提出。JSON 格式由 Douglas Crockford 于 2002 年提出。虽然这两种格式的设计目标并不相同，但它们常常用于同一个任务，也就是数据交换中。XML 和 JSON 的文档都很完善（RFC 7159、RFC 4825），且都同时具有 人类可读性 human-readable 和 机器可读性 machine-readable 。这两种格式并没有哪一个比另一个更强，只是各自适用的领域不用。（LCTT 译注：W3C 是互联网联盟，制定了各种 Web 相关的标准，如 HTML、CSS 等。Douglas Crockford 除了制定了 JSON 格式，还致力于改进 JavaScript，开发了 JavaScript 相关工具 JSLint 和 JSMin）XML 的优点XML 与 JSON 相比有很多优点。二者间最大的不同在于 XML 可以通过在标签中添加属性这一简单的方法来存储 元数据 metadata 。而使用 JSON 时需要创建一个对象，把元数据当作对象的成员来存储。虽然二者都能达到存储元数据的目的，但在这一情况下 XML 往往是更好的选择，因为 JSON 的表达形式会让客户端程序开发人员误以为要将数据转换成一个对象。举个例子，如果你的 C++ 程序需要使用 JSON 格式发送一个附带元数据的整型数据，需要创建一个对象，用对象中的一个 名称/值对 name/value pair 来记录整型数据的值，再为每一个附带的属性添加一个名称/值对。接收到这个 JSON 的程序在读取后很可能把它当成一个对象，可事实并不是这样。虽然这是使用 JSON 传递元数据的一种变通方法，但他违背了 JSON 的核心理念：“ JSON 的结构与常规的程序语言中的结构相对应，而无需修改。 JSON’s structures look like conventional programming language structures. No restructuring is necessary. ” 1 虽然稍后我会说这也是 XML 的一个缺点，但 XML 中对命名冲突、 前缀 prefix 的处理机制赋予了它 JSON 所不具备的能力。程序员们可以通过前缀来把统一名称给予两个不同的实体。 2 当不同的实体在客户端中使用的名称相同时，这一特性会非常有用。XML 的另一个优势在于大多数的浏览器可以把它以 具有高可读性和强组织性的方式 highly readable and organized way 展现给用户。XML 的树形结构让它易于结构化，浏览器也让用户可以自行展开或折叠树中的元素，这简直就是调试的福音。XML 对比 JSON 有一个很重要的优势就是它可以记录 混合内容 mixed content 。例如在 XML 中处理包含结构化标记的字符串时，程序员们只要把带有标记的文本放在一个标签内就可以了。可因为 JSON 只包含数据，没有用于指明标签的简单方式，虽然可以使用处理元数据的解决方法，但这总有点滥用之嫌。JSON 的优点JSON 自身也有很多优点。其中最显而易见的一点就是 JSON 比 XML 简洁得多。因为 XML 中需要打开和关闭标签，而 JSON 使用名称/值对表示数据，使用简单的 { 和 } 来标记对象，[ 和 ] 来标记数组，, 来表示数据的分隔，: 表示名称和值的分隔。就算是使用 gzip 压缩，JSON 还是比 XML 要小，而且耗时更少。 3 正如 Sumaray 和 Makki 在实验中指出的那样，JSON 在很多方面都比 XML 更具优势，得出同样结果的还有 Nurseitov、Paulson、Reynolds 和 Izurieta。首先，由于 JSON 文件天生的简洁性，与包含相同信息的 XML 相比，JSON 总是更小，这意味着更快的传输和处理速度。第二，在不考虑大小的情况下，两组研究 4 5 表明使用 JSON 执行序列化和反序列化的速度显著优于使用 XML。第三，后续的研究指出 JSON 的处理在 CPU 资源的使用上也优于 XML。研究人员发现 JSON 在总体上使用的资源更少，其中更多的 CPU 资源消耗在用户空间，系统空间消耗的 CPU 资源较少。这一实验是在 RedHat 的设备上进行的，RedHat 表示更倾向于在用户空间使用 CPU 资源。 6 不出意外，Sumaray 和 Makki 在研究里还说明了在移动设备上 JSON 的性能也优于 XML。 7 这是有道理的，因为 JSON 消耗的资源更少，而移动设备的性能也更弱。JSON 的另一个优点在于其对对象和数组的表述和 宿主语言 host…

JSON 的兴起与崛起
type: item
date: 2019-01-14T19:50:00+08:00
description: JSON 已经占领了全世界。当今，任何两个应用程序彼此通过互联网通信时，可以打赌它们在使用 JSON。它已被所有大型企业所采用：十大最受欢迎的 web API 接口列表中（主要由 Google、Facebook 和 Twitter 提供），仅仅只有一个 API 接口是以 XML 的格式开放数据的。 1 这个列表中的 Twitter API 为此做了一个鲜活的注脚：其对 XML 格式的支持到 2013 年结束，其时发布的新版本的 API 取消 XML 格式，转而仅使用 JSON。JSON 也在程序编码级别和文件存储上被广泛采用：在 Stack Overflow（LCTT 译注：一个面向程序员的问答网站）上，现在更多的是关于 JSON 的问题，而不是其他的数据交换格式。 2 XML 仍然在很多地方存在。网络上它被用于 SVG 和 RSS / Atom 信息流。Android 开发者想要获得用户权限许可时，需要在其 APP 的 manifest 文件中声明 —— 此文件是 XML 格式的。XML 的替代品也不仅仅只有 JSON，现在有很多人在使用 YAML 或 Google 的 Protocol Buffers 等技术，但这些技术的受欢迎程度远不如 JSON。目前来看，JSON 是应用程序在网络之间通信的首选协议格式。考虑到自 2005 年来 Web 编程世界就垂涎于 “异步 JavaScript 和 XML” 而非 “异步 JavaScript 和 JSON” 的技术潜力，你可以发现 JSON 的主导地位是如此的让人惊讶。当然了，这可能与这两种通信格式的受欢迎程度无关，而仅反映出缩写 “AJAX” 似乎比 “AJAJ” 更具吸引力。但是，即使在 2005 年有些人（实际上没有太多人）已经用 JSON 来取代 XML 了，我们不禁要问 XML 的噩运来的如此之快，以至于短短十来年，“异步 JavaScript 和 XML” 这个名称就成为一个很讽刺的误称。那这十来年发生了什么？JSON 怎么会在那么多应用程序中取代了 XML？现在被全世界工程师和系统所使用、依赖的这种数据格式是谁提出的？JSON 之诞生2001 年 4 月，首个 JSON 格式的消息被发送出来。此消息是从旧金山湾区某车库的一台计算机发出的，这是计算机历史上重要的的时刻。Douglas Crockford 和 Chip Morningstar 是一家名为 State Software 的技术咨询公司的联合创始人，他们当时聚集在 Morningstar 的车库里测试某个想法，发出了此消息。在 “AJAX” 这个术语被创造之前，Crockford 和 Morningstar 就已经在尝试构建好用的 AJAX 应用程序了，可是浏览器对其兼容性不好。他们想要在初始页面加载后就将数据传递给应用程序，但其目标要针对所有的浏览器，这就实现不了。这在今天看来不太可信，但是要记得 2001 年的时候 Internet Explorer（IE）代表了网页浏览器的最前沿技术产品。早在 1999 年的时候，Internet Explorer 5 就支持了原始形式的 XMLHttpRequest，开发者可以使用名为 ActiveX 的框架来访问此对象。Crockford 和 Morningstar 能够使用此技术（在 IE 中）来获取数据，但是在 Netscape 4 中（这是他们想要支持的另一种浏览器）就无法使用这种解决方案。为此 Crockford 和 Morningstar 只得使用一套不同的系统以兼容不同的浏览器。第一条 JSON 消息如下所示： 消息中只有一小部分类似于今天我们所知的 JSON，本身其实是一个包含有一些 JavaScript 的 HTML 文档。类似于 JSON 的部分只是传递给名为 receive() 的函数的 JavaScript 对象字面量。Crockford 和 Morningstar 决定滥用 HTML 的帧（ ）以发送数据。他们可以让一个帧指向一个返回的上述 HTML 文档的 URL。当接收到 HTML 时，JavaScript 代码段就会运行，就可以把数据对象字面量如实地传递回应用程序。只要小心的回避浏览器保护策略（即子窗口不允许访问父窗口），这种技术就可以正常运行无误。可以看到 Crockford 和 Mornginstar 通过明确地设置文档域这种方法来达到其目的。（这种基于帧的技术，有时称为隐藏帧技术，通常在 90 年代后期，即在广泛使用 XMLHttpRequest 技术之前使用。 3 ）第一个 JSON 消息的惊人之处在于，它显然不是一种新的数据格式的首次使用。它就是 JavaScript！实际上，以此方式使用 JavaScript 的想法如此…

不像 MySQL 的 MySQL：MySQL 文档存储介绍
type: item
date: 2018-06-24T17:19:00+08:00
description: MySQL 文档存储 可以跳过底层数据结构创建、数据规范化和其它使用传统数据库时需要做的工作，直接存储数据。MySQL 可以提供 NoSQL JSON 文档存储 Document Store 了，这样开发者保存数据前无需 规范化 normalize 数据、创建数据库，也无需在开发之前就制定好数据样式。从 MySQL 5.7 版本和 MySQL 8.0 版本开始，开发者可以在表的一列中存储 JSON 文档。由于引入 X DevAPI，你可以从你的代码中移除令人不爽的结构化查询字符串，改为使用支持现代编程设计的 API 调用。系统学习过结构化查询语言（SQL）、 关系理论 relational theory 、 集合 set 和其它关系数据库底层理论的开发者并不多，但他们需要一个安全可靠的数据存储。如果数据库管理人员不足，事情很快就会变得一团糟，MySQL 文档存储 允许开发者跳过底层数据结构创建、数据规范化和其它使用传统数据库时需要做的工作，直接存储数据。只需创建一个 JSON 文档集合 document collection ，接着就可以使用了。JSON 数据类型所有这一切都基于多年前 MySQL 5.7 引入的 JSON 数据类型。它允许在表的一行中提供大约 1GB 大小的列。数据必须是有效的 JSON，否则服务器会报错；但开发者可以自由使用这些空间。X DevAPI旧的 MySQL 协议已经历经差不多四分之一个世纪，已经显现出疲态，因此新的协议被开发出来，协议名为 X DevAPI。协议引入高级会话概念，允许代码从单台服务器扩展到多台，使用符合 通用主机编程语言样式 common host-language programming patterns 的非阻塞异步 I/O。需要关注的是如何遵循现代实践和编码风格，同时使用 CRUD （Create、 Read、 Update、 Delete）样式。换句话说，你不再需要在你精美、纯洁的代码中嵌入丑陋的 SQL 语句字符串。一个新的 shell 支持这种新协议，即所谓的 MySQL Shell。该 shell 可用于设置 高可用集群 high-availability cluster 、检查服务器 升级就绪状态 upgrade readiness 以及与 MySQL 服务器交互。支持的交互方式有以下三种：JavaScript，Python 和 SQL。代码示例下面的代码示例基于 JavaScript 方式使用 MySQL Shell，可以从 JS> 提示符看出。下面，我们将使用用户 dstokes 、密码 password 登录本地系统上的 demo 库。db 是一个指针，指向 demo 库。$ mysqlsh dstokes:password@localhost/demo JS> db.createCollection("example") JS> db.example.add( { Name: "Dave", State: "Texas", foo : "bar" } ) JS> 在上面的示例中，我们登录服务器，连接到 demo 库，创建了一个名为 example 的集合，最后插入一条记录；整个过程无需创建表，也无需使用 SQL。只要你能想象的到，你可以使用甚至滥用这些数据。这不是一种代码对象与关系语句之间的映射器，因为并没有将代码映射为 SQL；新协议直接与服务器层打交道。Node.js 支持新 shell 看起来挺不错，你可以用其完成很多工作；但你可能更希望使用你选用的编程语言。下面的例子使用 world_x 示例数据库，搜索 _id 字段匹配 CAN. 的记录。我们指定数据库中的特定集合，使用特定参数调用 find 命令。同样地，操作也不涉及 SQL。var mysqlx = require('@mysql/xdevapi'); mysqlx.getSession({ //Auth to server host: 'localhost', port: '33060', dbUser: 'root', dbPassword: 'password' }).then(function (session) { // use world_x.country.info var schema = session.getSchema('world_x'); var collection = schema.getCollection('countryinfo'); collection // Get row for 'CAN' .find("$._id == 'CAN'") .limit(1) .execute(doc => console.log(doc)) .then(() => c…