了解工业控制架构的 JSON 数据格式
对 JavaScript 对象表示法(JSON)有一些基本的了解非常重要,JSON 是当今互联工业世界中最常用的数据交换格式之一。
当我们讨论将数据从车间传输到远程处理器、将其转化为可操作决策的各种策略时,格式化和转换传感器值的能力变得非常重要。简单 IoT 项目最常见的数据格式化方法之一称为“JSON”。
什么是 JSON?
JSON 代表 JavaScript 对象表示法。它是一种纯文本格式,类似于 JavaScript 对象的结构。基于文本的文件或 JSON 字符串通过左右大括号 { } 进行定义,并包含键/值对形式的数据。一个非常简单的工业示例如下:
{ "machine": "A" }
所有键(也称为“属性”)必须用双引号定义。与键关联的任何基于字符串的值也需要双引号。JSON 格式不支持其他语言(例如 Python)中用于定义字符串的单引号。简要介绍了 JSON 特性的定义、它是如何产生的以及为什么它在世界上如此广泛使用?
更重要的是,为什么控制工程师应该了解一点这种格式?
XML 和 JSON 的历史
JSON 是一种相对较新的格式,在“网络泡沫”期间正式诞生。这个历史时代是由 Web 开发以及扩展的客户端-服务器架构定义的。随着互联网泡沫的蔓延,该领域的许多程序员和技术人员都在努力解决服务器端应用程序和客户端之间的数据传输问题。
现有的格式(例如 XML)对于人类和服务器来说认知和计算量都很大。这导致网络性能不佳和应用程序延迟。针对 XML 的进一步研究是感知。大公司变得过于渴望并滥用 XML 的可扩展性来开发过于复杂的工具集和应用程序。企业协会认为 XML 是一种不受欢迎的选择。然而,当时还没有正式存在其他广泛认可的格式。
这就是 JSON 的历史变得有趣的地方。虽然一位名叫道格拉斯·克罗克福德 (Douglas Crockford) 的人因获得社区、文档和对该格式的广泛认可而受到赞誉,但它可能在十年前就已经存在了。
许多斗志旺盛、适应性强的程序员已经意识到以字符串格式镜像 JavaScript 对象结构以进行数据传输的好处。这项创新源于使用笨重、令人头痛的基于 XML 的工具的痛苦。大多数人在彼此不知情的情况下得出了与同龄人相同的结论。这就是为什么 JSON 是当今使用最广泛的数据交换格式之一:它比 XML 更简单且认知更轻。
产业背景
尽管 JSON 主要用于传统 Web 开发,但它也广泛用于控制自动化领域。传输 IIoT 数据的低功能边缘或网关设备受益于 JSON 的效率。用于工厂监控和资产管理的 SCADA 系统和仪表板的响应能力和低延迟部分是由 JSON 格式实现的。它对于控制工程师通常看到的前端应用程序来说是不可见的,但在后台却非常活跃且必不可少。
数据类型Data Types
JSON 是否会为了简单性而失去一些可扩展性?是的,但这绝不是限制性的。与属性关联的值不仅限于字符串数据类型。值数据类型还可以包括数组、对象、布尔值、数字和空类型。
数组类型Array Type
此数据类型是包含在左括号和右括号 [ ] 内的一组有序值。数组中的值可以混合,它们不需要全部属于同一类型。值以逗号分隔。数组类似于 Python 中的列表。
{ "machine": 1, "parameters": ["Temperature", "Pressure"] }
对象类型Object Type
对象类似于 Python 字典,由括在左右大括号 { } 内的键/值对组成。键必须是字符串类型,各个值用冒号区分。键/值对的分隔是通过使用逗号来实现的。
{ "machine": 1, "parameters": { "temperature": 40, "pressure": 456, "configuration": "A" } }
布尔值Boolean
布尔逻辑的 0 或 1 条件可以用 true 或 false 来表示。
{ "machine": 1, "isActive": false, "isInMaintenance": true }
数字Number
JSON 中的数字可以用负整数、正整数、浮点数甚至指数表示法(e+、e-、E+ 或 E-)表示。
{ "machine": 1, "asset number": 345, "cost": 52345.56 }
数据传输和解析
JSON 的一个重要特性是其与语言无关的功能。尽管它是根据 JavaScript 对象建模的,但它作为字符串数据类型存在。这使得系统之间的网络数据传输变得简单而轻量。当涉及到在目标系统中接收和解析 JSON 有效负载时,有许多选项可用。
一般来说,“解包”有效负载的过程涉及反序列化。这意味着 JSON 字符串将转换为目标系统的本机数据类型。例如,在 Python 中,摄取的 JSON 字符串可以反序列化为本机 Python 字典数据类型。此过程使用内置 JSON 库加载方法,如下所示。
import json json_string = '{"machine": 1, "parameters": ["temperature", "pressure"],"OEE": 0.76}' print("Datatype before deserialization : " + str(type(json_string))) json_deserialized = json.loads(json_string) print("Datatype after deserialization : " + str(type(json_deserialized)))
该虚拟脚本的输出将显示 json.loads 方法如何转换数据类型。
mlevanduski@Michaels-MBP test % python3 jsonTest.py Datatype before deserialization : <class 'str'> Datatype after deserialization : <class 'dict'>
可以通过解析字典对象来解析 JSON 键或属性以获取关联值。按照上面的示例,添加以下代码行,保存并重新运行脚本将演示解析功能。
print("The machine key value is: " + str(json_deserialized['machine']))
其结果是.
Datatype before deserialization : <class 'str'> Datatype after deserialization : <class 'dict'> The machine key value is: 1
为什么 JSON 用于 IIoT?
JSON 是互联网早期出于必要性和独创性而诞生的一项发明。由于其简单性、有效性和多功能性,它经受住了时间的考验。在当今世界,它是一种非常常见和流行的数据交换格式,用于促进工业控制和物联网领域的数据传输。