跳转至

这 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_SERIALIZEJSON_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

使用 Airbus WorldDEM™ 和光学影像高程进行变化检测 ENVI -- 执行任务中