使用 CerealBox 将 AWS DynamoDB JSON 序列化为 Python dict

使用 CerealBox 将 AWS DynamoDB JSON 序列化为 Python dict

在这里,我们讨论了一个快速演练和参考代码,用于为您的下一个 AWS 应用程序简化 DynamoDB JSON 序列化过程。

绒毛在哪里?

当我开始使用 DynamoDB 时,我喜欢它的设置和入门是多么容易,无需担心可扩展性、可扩展性或可用性。直到我在客户端应用程序上创建数据模型时遇到了这个 JSON 序列化问题,一切似乎都井井有条。

“如果你只是坚持公地,事情就会变得如此简单,不是吗?”

好吧,当涉及到我们最喜欢的 AWS 解决方案之一 DynamoDB 数据库时,情况并非如此,这就是它的模糊之处。

数据类型

DynamoDB 固有地支持 3 种数据类型——字符串、数字和二进制——其余的通用数据类型是这些基本类型的简单派生。如果我们尝试用通用 Java 数据类型映射它们,我们会得到如下映射 -

Java 类型 对比 DynamoDB 类型
所有号码类型 - > _ñ_ (数字类型)
字符串->
_小号_ (字符串类型)
布尔值 ->
_布尔值_ (布尔类型),0 或 1
字节缓冲区->
_乙_ (二进制类型)
日期 ->
_小号_ _(字符串类型),存储为 ISO-8601 格式的字符串
_ 集合类型 - > _党卫军_ (字符串集)类型, _NS_ (数字集)类型,或 _学士学位_ (二进制集)类型

Java 映射器参考: Amazon DynamoDB 开发人员指南

我们的设置

为了理解这个问题并演示解决方案,让我们设置一个 DynamoDB 表,其中包含一些关于动画电影的随机数据(只是因为我喜欢它们)。

步骤1 : 创建 dynamodb 表 'movies'

Create dynamodb table ‘ movies ’ with ‘ title ’ as PartitionKey and ‘ genre ’ as SortKey

第2步 :添加具有不同数据类型的示例记录

这可以通过以下两种方式中的任何一种来完成 - 使用表单视图或在 DynamoDB 表的创建项目选项下提供的 JSON 视图

例如,让我们在某些假设下为电影“海兽”添加一条记录 -

Data types for movies table item constituents

Sample movie record added with multiple data types

第 3 步 : 客户端代码设置

现在是 Python 客户端——让我们将其设置为 3 个类的结构,这些类可以进一步扩展以在未来提供额外的特性——

  • DatabaseHelper — DynamoDB 查询的处理程序

  • MovieModel — 数据库调用和响应格式化管理器

  • Main - 这是管理执行流程的地方,将其视为将请求电影详细信息的用户界面

问题

通常,为了在 Python 中将任何响应对象转换为可管理的 json 格式流,我们使用 json.dumps(),这就是我们尝试在 常规方法 在 MovieModel 类中进行了评论。

反序列化尝试

要了解 DynamoDB json 的类型转换问题,请取消注释 常规方法 在 MovieModel 类中并注释 谷物盒方法 .现在运行主文件——

$ python3 main_movie_dynamodb_example_runner.py

观察和例外

这会导致错误 语言 场地 -

TypeError:类型集的对象不是 JSON 可序列化的

出现此问题是因为 StringSet 的输入数据类型无法识别为常规 Java 数据类型导致序列化失败。

解决方案

这个确切的序列化问题由 CerealBox 库管理,该库提供对 DynamoDB JSON 的开箱即用支持。

根据他们的官方简介——

CerealBox 是用于 python 字典的极快的零依赖通用序列化器/反序列化器。它具有可扩展的架构,允许通过 config 构建自定义序列化程序。该模块还包括将常见数据类型序列化为 JSON 兼容字典或 DynamoDB JSON 的内置实现。

参考图书馆: https://github.com/a2d24/cerealbox

使用 CerealBox 库进行序列化

现在在上面的同一个例子中,尝试运行主程序,而 谷物盒方法 未注释并且 常规方法 在 MovieModel 类中被注释。现在,这将以正确的格式序列化响应,并在控制台上打印电影详细信息 -

{'languages': ['Spanish', 'French', 'English'], 'userRating': '4.8', 'isReleased': True, 'releaseYear': '2022', 'genre': 'Adventure' , 'title': '海兽'}
在数据库中找不到电影。

我们现在可以从这个序列化的响应数据中构建数据模型,并在我们的应用程序中像常规 JSON 一样进一步使用它。

CerealBox 使用以下映射将 DynamoDB json 序列化为 Python dict —

DynamoDB JSON to Python Dict mapping done by CerealBox

结论

因此,虽然与 AWS DynamoDB 合作有其自身的优势和劣势,但 CerealBox 让您在迁移/采用云期间能够非常轻松地驾驭复杂的应用程序数据级别。 ❤️

把它包起来

请在评论中分享 你遇到如此低级的设计问题以及大象经历的时候,你在推过那个尾端时会感到头痒。

  • — 如果这次快速总结对您有所帮助,请鼓掌
  • — 与寻找答案的好奇者分享这篇文章
  • ➕ — 按下 跟随 调整更多此类简化的东西 , 移动应用程序开发系统

[

汉堡类比:命令式与声明式编程风格

理解历史评估的系统设计范式的基本方法

更好的编程.pub

](https://betterprogramming.pub/the-burger-analogy-for-imperative-vs-declarative-styles-of-programming-3caf026fd553)

[

使用 Mosquitto MQTT 代理流式处理 Flutter 事件

通过counter app示例程序探索Flutter中MQTT消息协议的威力

更好的编程.pub

](https://betterprogramming.pub/streaming-flutter-events-with-mosquitto-mqtt-broker-28998a3b81c2)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/10918/15260208

posted @ 2022-09-02 08:16  哈哈哈来了啊啊啊  阅读(80)  评论(0编辑  收藏  举报