【雕爷学编程】MicroPython手册之内置模块 ujson:JSON 数据的解析和生成

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

MicroPython的内置模块ujson是一个用于处理JSON数据格式的模块,它实现了CPython模块的一个子集,但也有一些特殊的特点和限制。本文将从以下几个方面介绍ujson模块的主要特点、应用场景,以及需注意事项,并给出几个实际运用程序案例。

主要特点

1、ujson模块提供了将Python对象编码为JSON字符串,或者将JSON字符串解码为Python对象的函数。
2、ujson模块使用的JSON数据格式是一种轻量级的数据交换格式,它基于JavaScript语言的一部分语法,但也可以被其他语言解析和生成。JSON数据格式由两种结构组成:对象(object)和数组(array)。对象是一组无序的键值对,数组是一组有序的值。这些值可以是字符串(string)、数字(number)、布尔值(true或false)、null或者对象或数组。
3、ujson模块可以将Python中的字典(dict)、列表(list)、元组(tuple)、字符串(str)、整数(int)、浮点数(float)、布尔值(bool)和None类型转换为JSON数据格式,或者反过来。但是,ujson模块不支持Python中的其他类型,如集合(set)、复数(complex)、字节串(bytes)等,如果尝试转换这些类型,会引发TypeError异常。
4、ujson模块在编码和解码时会尽量保持数据的精度和完整性,但是由于Python和JSON之间的类型不完全对应,可能会出现一些细微的差异。例如,Python中的整数和浮点数在JSON中都被表示为数字类型,但是在解码时可能会根据数值大小自动转换为int或float类型;Python中的元组在JSON中被表示为数组类型,但是在解码时会转换为list类型;Python中的None在JSON中被表示为null,但是在解码时会转换为NoneType类型。

应用场景

1、ujson模块可以用于在不同平台或语言之间进行数据交换,例如在MicroPython和Web服务器之间传递数据,或者在MicroPython和其他设备之间通信。
2、ujson模块可以用于将数据持久化存储,例如将配置信息或用户数据保存到文件或数据库中,或者从文件或数据库中读取数据。
3、ujson模块可以用于处理复杂的数据结构,例如将嵌套的对象或数组转换为平面的键值对,或者反过来。

需注意事项

1、ujson模块的功能和性能可能因不同的端口而异,因此在开发可移植的MicroPython应用程序时,应该尽量避免依赖特定的编码或解码细节。
2、ujson模块在编码和解码时可能会消耗较多的内存和时间,因此在处理大量或复杂的数据时,应该注意优化代码和资源管理。
3、ujson模块在编码和解码时可能会遇到无效或不合法的数据格式,例如缺少引号、括号、逗号等符号,或者包含注释、控制字符等非法字符。这些情况会引发ValueError异常,并给出错误信息。应该使用try-except语句来捕获并处理这些异常。

实际运用程序案例

案例一:使用ujson模块从Web服务器获取天气信息

import network
import urequests
import ujson

# 连接到WiFi网络
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('SSID', 'PASSWORD')
while not sta_if.isconnected():
    pass

# 从Web服务器获取天气信息
url = 'http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=YOUR_API_KEY'
response = urequests.get(url)
data = response.text
response.close()

# 使用ujson模块解析天气信息
weather = ujson.loads(data)
print('城市:', weather['name'])
print('温度:', weather['main']['temp'] - 273.15, '℃')
print('湿度:', weather['main']['humidity'], '%')
print('天气:', weather['weather'][0]['description'])

案例二:使用ujson模块将配置信息保存到文件中

import ujson

# 定义一个配置信息的字典
config = {
    'name': 'MicroPython',
    'version': '1.17',
    'port': 'esp32',
    'features': ['ujson', 'urequests', 'machine']
}

# 使用ujson模块编码配置信息为JSON字符串
data = ujson.dumps(config)

# 将JSON字符串写入文件中
with open('config.json', 'w') as f:
    f.write(data)

案例三:使用ujson模块将嵌套的对象转换为平面的键值对

import ujson

# 定义一个嵌套的对象
obj = {
    'name': 'Alice',
    'age': 18,
    'address': {
        'city': 'Beijing',
        'street': 'Xueyuan Road',
        'number': 37
    },
    'hobbies': ['reading', 'writing', 'coding']
}

# 使用ujson模块编码对象为JSON字符串
data = ujson.dumps(obj)

# 使用ujson模块解码JSON字符串为字典
dic = ujson.loads(data)

# 定义一个函数,将嵌套的字典转换为平面的键值对
def flatten(dic, prefix=''):
    result = {}
    for key, value in dic.items():
        if isinstance(value, dict):
            result.update(flatten(value, prefix + key + '.'))
        elif isinstance(value, list):
            for i, item in enumerate(value):
                result[prefix + key + '[' + str(i) + ']'] = item
        else:
            result[prefix + key] = value
    return result

# 调用函数,得到平面的键值对
flat = flatten(dic)
print(flat)

案例四:JSON解析:

import ujson

# JSON字符串
json_str = '{"name": "John", "age": 30, "city": "New York"}'

# 解析JSON字符串
data = ujson.loads(json_str)

# 访问解析后的数据
name = data["name"]
age = data["age"]
city = data["city"]

# 打印解析后的数据
print("Name:", name)
print("Age:", age)
print("City:", city)

在这个示例中,我们使用ujson模块的loads()函数将JSON字符串解析为Python对象。loads()函数将JSON字符串转换为对应的字典对象。在这里,我们解析了一个包含名字、年龄和城市的JSON字符串,并访问解析后的数据。

案例五:JSON编码:

import ujson

# Python对象
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

# 将Python对象编码为JSON字符串
json_str = ujson.dumps(data)

# 打印编码后的JSON字符串
print("JSON string:", json_str)

在这个示例中,我们使用ujson模块的dumps()函数将Python对象编码为JSON字符串。dumps()函数将Python字典对象转换为对应的JSON字符串。在这里,我们将一个包含名字、年龄和城市的字典对象编码为JSON字符串,并打印编码后的结果。

案例六:JSON文件读写:

import ujson

# 从JSON文件读取数据
with open('data.json', 'r') as file:
    json_str = file.read()

# 解析JSON字符串
data = ujson.loads(json_str)

# 修改数据
data["age"] = 35

# 将数据写入JSON文件
with open('data.json', 'w') as file:
    file.write(ujson.dumps(data))

在这个示例中,我们使用ujson模块从JSON文件中读取数据,并对数据进行修改后再写回文件。首先,我们使用open()函数打开JSON文件并读取其内容到一个字符串变量中。然后,我们使用loads()函数将JSON字符串解析为Python对象。接下来,我们修改了数据中的年龄字段。最后,我们使用open()函数再次打开JSON文件,并使用dumps()函数将修改后的数据转换为JSON字符串,并将其写入文件中。这些实际运用程序案例展示了使用MicroPython内置模块ujson的功能。通过使用ujson模块,可以解析JSON字符串、编码Python对象为JSON字符串,并进行JSON文件的读写操作。这对于与其他系统进行数据交换、配置文件的读写等场景非常有用。

案例七:将 JSON 对象转换为字典或列表

import ujson

# 定义 JSON 字符串
json_str = '{"name": "Alice", "age": 25, "scores": [90, 95, 88]}'

# 将 JSON 字符串转换为字典
data_dict = ujson.loads(json_str)

# 打印转换后的字典
print("转换后的字典:", data_dict)

# 将 JSON 字符串转换为列表
data_list = ujson.loads(json_str)

# 打印转换后的列表
print("转换后的列表:", data_list)

在这个例子中,我们使用 ujson.loads() 函数将 JSON 字符串转换为 Python 中的字典和列表。我们定义了一个 JSON 字符串 json_str,其中包含一个名为 “name” 的字符串键值对,一个名为 “age” 的整数键值对,以及一个名为 “scores” 的列表。通过调用 ujson.loads() 函数,我们将 JSON 字符串转换为字典和列表,并将其打印出来。

案例八:将字典或列表转换为 JSON 对象

import ujson

# 定义字典
data_dict = {"name": "Alice", "age": 25, "scores": [90, 95, 88]}

# 将字典转换为 JSON 对象
json_obj = ujson.dumps(data_dict)

# 打印转换后的 JSON 对象
print("转换后的 JSON 对象:", json_obj)

在这个例子中,我们使用 ujson.dumps() 函数将字典转换为 JSON 对象(即 JSON 字符串)。我们定义了一个字典 data_dict,其中包含一个名为 “name” 的字符串键值对,一个名为 “age” 的整数键值对,以及一个名为 “scores” 的列表。通过调用 ujson.dumps() 函数,我们将字典转换为 JSON 对象,并将其打印出来。

案例九:从文件中读取 JSON 数据

import ujson

# 从文件中读取 JSON 数据
with open("data.json", "r") as file:
    json_data = file.read()

# 将 JSON 数据转换为字典
data_dict = ujson.loads(json_data)

# 打印转换后的字典
print("转换后的字典:", data_dict)

在这个例子中,我们使用 ujson.loads() 函数将从文件中读取的 JSON 数据转换为字典。我们使用 open() 函数打开名为 “data.json” 的文件,并使用 “r” 模式进行读取。然后,我们使用 file.read() 方法读取文件中的 JSON 数据。通过调用 ujson.loads() 函数,我们将 JSON 数据转换为字典,并将其打印出来。

这些示例展示了 ujson 模块在 MicroPython 中的实际应用。你可以根据自己的需求进行修改和扩展。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
nlohmann::json是一个开源的C++库,用于解析和处理JSON数据。它提供了简单易用的API,可以方便地将JSON数据解析为C++对象,并且可以轻松地将C++对象转换为JSON格式。 要使用nlohmann::json解析文件,首先需要包含头文件`#include <nlohmann/json.hpp>`。然后,可以使用`nlohmann::json`类型的对象来表示JSON数据,并使用该对象的成员函数来解析文件。 以下是解析文件的基本步骤: 1. 打开文件并读取JSON数据。 2. 使用`nlohmann::json`对象来解析JSON数据。可以使用`json::parse()`函数将JSON字符串解析为`nlohmann::json`对象。 3. 使用`nlohmann::json`对象的成员函数来访问和处理JSON数据。 下面是一个简单的示例代码,演示了如何使用nlohmann::json解析文件: ```cpp #include <iostream> #include <fstream> #include <nlohmann/json.hpp> int main() { // 打开文件并读取JSON数据 std::ifstream file("data.json"); std::string jsonData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); // 使用nlohmann::json对象解析JSON数据 nlohmann::json json = nlohmann::json::parse(jsonData); // 访问和处理JSON数据 std::string name = json["name"]; int age = json["age"]; // 输出解析结果 std::cout << "Name: " << name << std::endl; std::cout << "Age: " << age << std::endl; return 0; } ``` 请注意,上述示例代码假设文件名为"data.json",并且文件中包含以下JSON数据: ```json { "name": "John", "age": 25 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值