这 JSON 究竟是什么呢?
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/what-is-this-json-anyway
11970 文章评分:
1.0
这 JSON 究竟是什么呢?
匿名 星期四, 2015年11月12日
JSON(JavaScript 对象表示法)已在多篇 IDL 和 ENVI 博客文章中被提及,并且它正逐渐在 IDL 程序员中流行,用于传输和存储信息。事实上,JSON 是定义自定义 ENVITask 的首选格式,并且从 ENVI 5.2 开始,ENVI 开始使用 JSON 格式保存首选项,而不是内部保存文件。
为什么 JSON 在 IDL 程序员中如此受欢迎?
很可能是因为 JSON 格式的简单性和可读性,使得 IDL 用户比起 XML 等类似格式更偏爱它。此外,JSON 明确定义的结构使其比纯文本更加通用。
IDL 的JSON_SERIALIZE 和 JSON_PARSE 例程使得在 JSON 文本和 IDL 变量之间传递信息变得非常容易。将这些单行调用与使用 IDLffXMLDOMDocument 解析或创建 XML 文件所需的复杂代码进行比较。
有关使用 JSON 保存和恢复信息的示例,请参阅这篇博客文章。
JSON 是如何工作的?
让我们深入了解 JSON 格式,学习它的工作原理。
JSON 可以包含嵌套的对象或数组。对象用 { 和 } 表示,数组用 [ 和 ] 表示。
| JSON | IDL |
| 对象 - 包含键值对 | OrderedHash(如果顺序不重要,也可以是普通哈希表) |
| 数组 - 包含任意类型的项、子列表或子对象 | 列表 |
数组中的项用逗号分隔,对象的键值对用 "name": value 表示,同样用逗号分隔。
JSON 可以包含四种不同类型的值:
| JSON | IDL |
| 字符串 - 用引号括起来。 -- 不能包含引号或其他特殊字符。 | 字符串 |
| 数字 -- 支持指数表示法(例如 1.602E-19) | 数字 |
| 布尔值(true 或 false) | IDL 布尔值 (!true 或 !false) |
| null | !null |
关于数字的注意事项: IDL 假设最高可能的精度(如果数字包含小数点,则为双精度;如果没有小数点,则为 Long64)。
隐式打印 - 展示 IDL 到 JSON 的示例
在列表或哈希表上使用传统的 HELP 或 PRINT 调用并不总是能提供最有帮助的结果,尤其是当列表和哈希表相互嵌套时。
myHash = OrderedHash($
'Name', 'Ben', $
'Date', '12 Nov 2015', $
'Colors', ['red', 'yellow', 'blue', 'green', 'black'], $
'Other Items', OrderedHash($
'Numbers', [1,2,3], $
'Should I get more coffee?', !true, $
'Number of items in my backpack', 0, $
'Items in my backpack', !null))
PRINT, myHash
IDL 将显示:
Name: Ben
Date: 12 Nov 2015
Colors: red ...
Other Items: HASH
如果你尝试调用 HELP, myHash
IDL 将显示:
MYHASH ORDEREDHASH
...这帮助性更小。然而,在列表或哈希表上使用隐式打印时,IDL 会显示一个非常易读的 JSON 字符串。
myHash
IDL 打印:
{
"Name": "Ben",
"Date": "12 Nov 2015",
"Colors": ["red", "yellow", "blue", "green", "black"],
"Other Items": {
"Numbers": [1, 2, 3],
"Should I get more coffee?": true,
"Number of items in my backpack": 0,
"Items in my backpack": null
}
}
此外,隐式打印可用于以相同的可读格式将列表或哈希表打印到 JSON 文件中。这比将 JSON_SERIALIZE 的结果打印到文件中更有用,因为 JSON_SERIALIZE 的结果是单行字符串。
OPENW, unit, 'C:\scratch\json_example.json', /GET_LUN
PRINTF, unit, myHash, /IMPLIED_PRINT
FREE_LUN, unit
关于布尔值的说明
好的,当大多数 IDL 代码只使用 1 或 0 时,我为什么要在 IDL 中提及使用 !true 和 !false 布尔值呢?
传统上,IDL 从未有过真正的布尔值。相反,逻辑“真”用数字 1 表示,逻辑“假”用数字 0 表示。多年来,大多数 IDL 程序员都接受了这一点。然而,这样做的后果是,JSON 中的布尔值在 IDL 中被转换为整数,导致真值被误表示,并且无法使用 IDL 将布尔值写入 JSON 文本。事实上,这正是在 IDL 8.4 中 IDL 开始支持 !true 和 !false 以及 Boolean 函数的主要原因之一。然而,由于传统和习惯,许多 IDL 程序员仍然使用 1 和 0 来表示真和假。
参考文献
除了参考 IDL 和 ENVI 文档页面外,在撰写此博客时,我还使用了以下网站作为参考,这是 JSON 格式的官方网站:www.json.org