教你如何开发一个数据转换插件

智能家居开源生态—正确的HTTP API 接口规范以及设备类插件实现 一、HTTP API 接口规范 接口鉴权 使用smartassistant接口,需将用户凭证smart-assistant-token,放在http请求的header中。格式如下: "smart-assistant-token":"xxx" 2. 返回标准数据结构 smartassistant接口均返回JSON格式数据,格式如下: { "status":0, // 状态码 "reason":"", // 状态码描述 "data":{} // 所有业务数据返回都包含在data对象中 阅读详情

在开发过程中,或多或少都会遇到数据格式转换的问题,如果只是简单的数据,那自然用什么方式都可以,如果遇到数据非常多、层级复杂、关联性强的数据,则需要摸索出一套合适的,本文会介绍两种比较可行的转换模型,他们各自适合不同的场景和喜好。

不同的平台上开发导入/导出插件,自然会受到该平台硬性条件的约束,例如供主系统调用的函数名、约定的传入和返回的参数形式、与主系统共享的环境变量等等。

这些方面各自的平台难免会有所差异,难以统一讨论,但其本质是数据结构的转换,也是本文想要讨论的主题。

无论在功能上是导入或导出,我们所做的事情是类似的,都是将一种数据结构转换成另一种数据结构。

在开始之前,我们先约定一下术语,我们将转换前的数据称之为源数据,将转换后的数据,称之为目标数据。

作为例子,我们有一份自己系统所属的接口数据,需要将其转换成 postman 平台的数据,本文将探讨如何处理各种场景。

字段差异

最简单的情况,字段内容一样,仅仅是字段名不一样,例如在我们的数据中,接口请求地址叫做 url, 在目标数据格式中,请求接口地址叫做 uri ,那只需要做一下简单的转换即可:

const translate = ({ url }) => {
    return {
        uri: url
    }
}

 我们将难度稍微提升一点,考虑更复杂一些的情况,是字段之间的关系是一对多,或多对一。例如在源数据中,需要用  host  +  path 两个字段来描述接口地址,而在目标数据中仅用一个字段 url 来描述。在这种情况下,我们最好使用另一个小函数来处理:

const translatePath = ({ host, path }) => ({
        url: host + path
})

const translate = ({ host, path }) => {
    return {
        ...translatePath({ host, path })
    }
}

在一对多、或多对一、多对多这几种字段关系中,都可以用该思路,灵活地封装出 translateRequest、translateResponse 等多个函数,将他们在返回值中堆叠在一起:

const translate = ({ host, path, request, response }) => {
    return {
        ...translatePath({ host, path }),
        ...translateRequest({ path, request }),
        ...translateResponse({ response })
    }
}

大致的处理模型如此,由于每一个子函数都是独立运行、独立解析,不存在缓存和副作用,因而较好维护,在传参、取参时可以灵活控制自己需要或不要的参数;一些非空处理、边界处理,也都可以在对应的子函数中操作;庆幸 ES6+ 提供了比较优雅的解构语法,能让程序整体看起来较为简洁。

层级差异

上面所说的都是字段与字段之间的关系,但数据结构之间的差异不只是有字段,还有层级。如果沿用上面的处理模式,遇到层级较深、并且含有级联关系的数据结构,可能会难于处理。因此,在这里需要介绍另一种处理模型——基于 class 语法的模型。

为什么需要引入 class ?

并非是要对数据结构进行抽象,而是基于class比较容易使用链式调用语法,如有需要,我们还可以比较方便地使用缓存。

还是以接口数据为例,我们考虑这样一种场景,在源数据中,接口的 rest 参数,定义在最外层,而在目标数据中,rest 参数定义在 request 字段中,两者之间差了一个层级。我希望以这样的语法处理数据结构间的转换:

new Translate(source).translateRest()

同理,也是一个函数只做一件事,只不过在语法上,各个子函数以链式调用的形式结合在一起:

new Translate(source)
    .translateRest()
    .translateRequest()
    .translateResponse()

那么 Translate 这个类需要怎么实现呢?

其实不难,只要我们捡起远古的记忆,回到最初的 jQuery ,在每个子函数处理后,返回 this 即可。至于每个子函数转换的数据,自然是存在类内部的私有属性中,也可以理解为缓存。因此在最后,我们需要一个额外的函数,帮助我们将已经转换好的缓存数据取出来。

new Translate(source)
    .translateRest()
    ...
    .translateResponse()
    .getResult()

Translate 类中大致需要这么几个部件:

  • 至少需要两个缓存变量,这里暂时称之为 source 和 result ,前者用于存放源数据,后者用于存放转换中的数据。

  • 在 constructor 中,将接受到的源数据缓存起来,方便后面的子函数取用。

  • 各个子函数每次都从缓存中取出源数据,根据源数据的数据特征,从特定的层级中取出特定的字段,进行转换,然后塞入到 result 对应的层级中,随后记得返回 this。

  • 在转换结束后,调用 getResult 方法,将 result 取出,在这一步就不再返回 this 了。

  • 最后一个,根据我自己的经验,还需要有一个方便打印数据的函数,暂且叫 log 吧。

我们即刻实现一下基础架构,除了 Class 的语法外,还可以结合前半段介绍的处理模型来用:

const translateRest = ({ rest }) => ({
    ...    // 返回处理好的格式
})

class Translate {
    constructor(source) {
        // 初始化
        this.source = source
        this.result = {}
    }
    translateRest() {
        // 在该函数中,比较好地处理了层级问题
        this.result.request = {
            ...translateRest(source)
        }
        return this
    }
    translateResponse() {
        this.result.response = {
            ...
        }
        return this
    }
    log() {
        // 格式化输出
        console.log(JSON.stringify(this.result, null, 2))
        return this
    }
    getResult() {
        // 这是链式处理的最后一步
        return this.result
    }
}

这样的处理模型,确实是破坏了子函数的原子性,因为它不得不对外部的缓存进行读写,引入了一些副作用,但基本的缓存只有两个,复杂不会太高。但是用这个模型,能让处理层级差异变得简单,你可以用多个子函数处理某一层级中的多个字段(可能要注意先后顺序),比如下个例子就用三个子函数,来处理 request 层级下的多个字段:

new Translate(source)
    .translateRequestHeader()
    .translateRequestBody()
    .translateRequestQuery()
    ...

总结起来,该模型有以下几个明显的优势:

  1. 得益于缓存,子函数可以任意读取源数据中多个层级的字段。同理地,子函数也可以在任意一个层级写入目标数据。

  2. 由于是链式语法,在处理链路中,可以比较灵活地插入子函数、调整顺序,比如在任意一个子函数后面插入log函数进行打印,这一特点在开发和调试中尤其方便。

new Translate(source)
    .translateRest()
    ...
    .log()    // 随时插入打印
    .translateResponse()
    .getResult()

需要注意是,由于使用了缓存,因此在开发过程中,需要注意深浅拷贝的问题。

结尾

本文大致由浅及深地介绍了两种处理模型,应该足够应付大部分数据结构转译的场景。当实现了整个算法后,接下来要做的事情就只是按照平台的插件规则,将其包装成一个合格的插件。

我们就是基于这样的独立模型,在开源产品 Eoapi 产品中实现 OpenApi 格式的导入和导出插件。当然,OpenApi 的数据结构比较复杂,我们目前只是开个了头,正在逐步完善。Eoapi的插件仓库

感谢阅读本文,希望你从此也能够轻松处理数据结构的转换。

Eoapi 是一款类 Postman 的开源 API 工具,它更轻量,同时可拓展。

项目地址: https://github.com/eolinker/eoapi

文档地址:https://docs.eoapi.io/?utm_source=优快云0802

官网地址:https://www.eoapi.io/?utm_source=优快云0802

如果你对于 Eoapi 有任何疑问或者建议,都可以去 Github 或者来这里找我,提个 Issue ,我看到了都会及时回复的。

插件开发实战:扩展DBSyncer的自定义数据转换能力 本文详细介绍了如何通过插件开发扩展DBSyncer的自定义数据转换能力。作为一款开源的数据同步工具,DBSyncer的插件机制允许开发者实现高度定制化的数据处理逻辑。文章从环境搭建、核心机制解析到实战案例,全面讲解插件开发流程,帮助开发者掌握这一强大的扩展能力。 阅读详情

相关推荐

DBSyncer插件开发全攻略:手把手教你自定义数据转换逻辑

本文详细介绍了DBSyncer插件开发的全流程,从环境配置到高级定制技巧,帮助开发者掌握自定义数据转换逻辑的实现方法。通过实战案例演示如何利用DBSyncer中间件解决异构系统间的数据同步问题,提升数据处理效率和灵活性。

weixin_33704234的博客 357

第三方接口转换工具类

转换示例: {“retCode#int”: “code”, “parkInfo#data”: [{“dataType#int”: “DATA_TYPE”, “parkingId#int”: “PARKING_ID”, “realBerth#int”: “REAL_BERTH”, “address#string”: “ADDRESS”, “markExpiry#int”: “MARK_EXPIRY”, “monthBerth#int”: “MONTH_BERTH”, “totalBerth#int”: “TO

cxy_19891109的博客 518

从EasyRetro到Excel的便捷数据转换工具

本文还有配套的精品资源,点击获取 简介:在追求效率和便捷性的今天,EasyRetro To Excel Converter-crx插件为开发人员提供了将EasyRetro开发板数据轻松转换到Excel电子表格的能力,从而优化数据管理与分析流程。这款插件专为EasyRetro设计,允许用户一键导出数据,简化了复杂的数据分析和跨平台分享的过程,让团队成员可以更好地理解迭代回顾会...

weixin_35671843的博客 1113

接口自动化框架里常用的小工具【建议收藏】

在日常编程工作中,我们常常需要处理各种与时间、数据格式及配置文件相关的问题。本文整理了一系列实用的Python代码片段,涵盖了日期时间转换、数据格式化与转换、获取文件注释以及读取配置文件等内容,助力开发者提升工作效率,轻松应对常见任务。

386

将树状JSON数据转换为表格的jQuery插件实现

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它的语法简单,与JavaScript中的对象字面量语法十分相似,这种特性使得它成为前后端数据交换的热门选择。相较于XML,JSON具有以下优势:轻量级:JSON文本占用的空间更小,传输更快。可读性:JSON的格式比XML更简洁,易于阅读和理解。语言无关。

weixin_34162851的博客 807

coolmap-plugin-create:一个用于创建数据转换的示例coolmap插件

#coolmap-plugin-create 这是一个用于创建数据转换的示例coolmap 插件。 加载插件后,您应该能够在插件文件夹中找到几个菜单项。 以下是设置插件的方法。 获取 CoolMap 的分布式版本。 然后在该文件夹中,您应该找到 CoolMap.jar 和一个插件文件夹。 如果您希望使用与默认值不同的插件文件夹。 编辑分布式 CoolMap 文件夹中的 config.json。 更改"plugin":{"directory":"plugin", "relative":"true"} 的值。 如果"relative"设置为非"true" ,则文件夹将是绝对路径,而不是相对于 CoolMap 分发文件夹的路径。 通过双击 CoolMap.jar 来运行 CoolMap 以确保它正常工作。 创建一个新的 Java 项目。 在类路径中添加 CoolMap.jar(在 Ne

Dataway 接口配置工具

经过上面的几个步骤我们介绍了如何基于 Spring Boot 项目使用 Dataway 来简单的配置接口。Dataway 的方式确实给人耳目一新,一个接口竟然可以如此简单的配置出来无需开发任何一行代码,也不需要做任何 Mapping 实体映射绑定。

m0_47281737的博客 281

SAP FB03凭证修改实战:巧用BAPI FI_DOCUMENT_CHANGE更新抬头与行项目

本文详细介绍了SAP FB03凭证修改的实战技巧,重点解析了BAPI FI_DOCUMENT_CHANGE的使用方法。通过该接口,用户可以在不冲销原凭证的情况下直接更新抬头文本(BKTXT)和行项目文本(SGTXT),确保凭证编号连续且符合审计要求。文章包含核心机制解析、完整实现步骤、错误处理方案以及高级应用场景,帮助开发者高效完成SAP财务凭证修改。

weixin_29251567的博客 423

第6章 数据转换

利用Kettle工具来实现数据的转换

qq_63450701的博客 419

Xshell 连接 VMware虚拟机操作 截图和使用

vmwareVMware总部位于美国加州帕洛阿尔托(Palo Alto),是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任,实现任意云端和设备上运行、管理、连接及保护任意应用Xshell(安全终端模拟软件)Xshell [1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。

小 tom的博客 800

Autodesk Genuine Service卸载失败?试试这个隐藏文件删除法(Win8-Win11通用)

本文针对Autodesk Genuine Service在Windows系统(Win8-Win11)中卸载失败的常见难题,提供了深度解析与根治方案。核心方法是手动定位并删除两个关键的隐藏文件(ProductInformation.pit和id.dat),以解除文件锁定或数据损坏导致的卸载障碍,随后再通过标准流程即可成功卸载。该方法通用性强,能有效解决这一困扰设计师和工程师的顽固问题。

weixin_29220405的博客 1472

Optimus插件开发完全指南:如何扩展你的数据转换能力

Optimus是一个易于使用、可靠且高性能的工作流编排器,专门用于数据转换、数据建模、管道和数据质量管理。通过Optimus插件开发,您可以轻松扩展数据转换能力,为不同的数据仓库和第三方系统提供支持。本终极指南将带您深入了解Optimus插件开发的完整流程,从基础概念到实战应用。 ## 📋 插件开发基础概念 Optimus插件系统提供了两种实现方式:**YAML插件**和**二进制插件**。

gitblog_00434的博客 836

在thinkBook16的win11基础上安装ubuntu22.04

背景:联想ThinkBook16 pro 32G/512G,系统盘已安装Win11,加装一条M.2-2T固态,想在2T上分一个300GB的EXT4分区,然后把ubuntu22.04安装在该分区上,并实现Win11+Linux多系统共存。 目标:实现多磁盘下分区管理的简化,优化掉一些不必要的多余的维护性质的分区。

QzmAIoT 4001

DBAPI插件开发指南

DBAPI插件开发指南

我的博客 1417

UE 动态获取 资源缩略图 下载到本地或返回图片信息

UE 动态加载资源缩略图 返回图片信息或保存到本地

qq_46080252的博客 1935

Vue+Echarts监控大屏实例四:智慧农业监控模板实例

本实例通过Vue-Echarts实现了智慧农业监控模板实例界面,学习并使用了vue-echarts的使用,接入高德地图并展示,添加了全屏切换、加载动画小鼓、站点切换及退出等相关功能,提供源码下载。

Java、前端、小程序学习笔记、问题汇总、项目实例分享,有需要请联系。 7667

CloudQuery 扩展开发:从基础插件到复杂数据转换器的进阶之路

CloudQuery 是一个强大的数据查询引擎,可以将 SQL 查询转换为 GraphQL 查询,适合在需要访问多个数据源的 Web 应用程序中使用。作为基于 GraphQL 的数据查询引擎,CloudQuery 的可扩展架构让开发者能够创建各种插件来满足不同的数据处理需求。 ## 🚀 CloudQuery 插件架构概述 CloudQuery 采用可插拔架构,使用 gRPC 在源插件、CLI

gitblog_00323的博客 385

28、时间敏感网络中可靠性感知的综合路由与调度

本文针对时间敏感网络(TSN)中现有路由与调度机制主要关注时间触发(TT)流量而忽略其他类型流量效用的问题,提出了一种可靠性感知的综合路由与调度机制。通过将具有不同可靠性和延迟要求的各类流量的联合路由与调度问题形式化为基于优化模理论(OMT)的混合整数规划问题,设计了完整的路由约束与调度约束,并分析了不同类型流量的传输效用,设定了优化目标以提升整体网络性能。实验结果表明,该机制在满足TT流量严格时延与可靠性要求的同时,显著提高了AVB和BE等非关键流量的传输效用,实现了多类型流量的高效协同传输。

hhh00的博客 95

Gatsby 学习 - 06 开发数据转换插件

开发数据转换(Transformer)插件 插件介绍 数据转换插件主要做三件事情: 找到要转换的数据节点 转换节点内容的数据格式 将转换后的数据添加到数据层中 需求:将 xml 数据转换为 JavaScript 对象。 插件开发步骤 在 plugins 文件夹中创建 gatsby-transformer-xml 文件夹 在插件文件夹中创建 gatsby-node.js 文件 在文件中导出 onCreateNode 方法,该方法会在每个节点构建完成时执行,可以获取节点信息 根据节点类型筛选 xml 节点

皮蛋很白的博客 201

dolphinscheduler集群服务一键安装启动实现流程剖析

通过以上分析我们基本梳理清楚了整个dolphinscheduler项目的一键安装启动逻辑, 我们现在在通过一张图正好理一下整个实现流程。关于一键停止集群服务及一件查询集群各个角色服务实例运行状态的实现也都在stop-all.sh/status-all.sh及dolphinscheduler-daemon.sh这三个脚本中, 有兴趣自行研究。写这篇文章的核心目的不仅在于给大家分享如何优秀的开源项目的一键安装部署的实现过程。

最爱嫣夜来 1207

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

开发一个数据转换插件真的没那么难

不同的平台上开发导入/导出插件,自然会受到该平台硬性条件的约束,例如供主系统调用的函数名、约定的传入和返回的参数形式、与主系统共享的环境变量等等。

GGGGdragon的博客 281

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HarmonyOS NEXT应用开发实战:一分钟写一个网络接口,JsonFormat插件推荐

JsonFormat插件可以极大地简化鸿蒙应用开发中的数据处理过程。通过这个插件,开发者只需简单操作,即可将JSON转化为对应的鸿蒙ets类,减少手动编写代码的时间,提高工作效率。JsonFormat插件。

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 2018

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Flutter插件开发:手把手教你编写自定义插件

核心概念回顾Platform Channel是跨平台通信的基石方法调用与事件监听两种通信模式三端(Dart/Android/iOS)协同开发模式思考题如何实现一个持续获取位置更新的插件?当Android和iOS平台API不一致时,如何设计统一接口?如何优化插件的数据传输效率?附录:常见问题Q:如何处理异步操作?A:在原生端使用Result.success/error回调,Dart端使用async/awaitQ:插件支持Web平台吗?

AI架构全栈开发实战笔记 535

QT插件化开发详细教程

QT插件化开发是一种使用QT框架进行软件开发的方法,其中功能组件可以以插件的形式加载和使用。这种方法可以提高软件的可扩展性和灵活性,允许开发人员在不修改主程序代码的情况下动态地添加、移除或更新功能模块。QT插件通常以共享库的形式存在,可以在运行时动态加载到应用程序中。通过QT插件化开发,开发人员可以实现模块化设计,将不同功能模块拆分成独立的插件,便于管理和维护。这种方法还有助于降低软件开发的复杂性,提高代码的重用性,同时也使得软件更容易适应不断变化的需求。interface。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 2331

StudioPlugins插件开发入门:如何为Android Studio开发自己的插件

通过本文的介绍,相信你已经对Android Studio插件开发有了基本的了解。动手实践,开发属于自己的插件,提升Android开发效率吧!

gitblog_00162的博客 825

Zodios插件系统完全指南:自定义验证与数据转换

Zodios是一个功能强大的TypeScript HTTP客户端和服务器工具,它结合了Zod验证功能,为开发者提供端到端的类型安全体验。插件系统是Zodios的核心特性之一,它允许开发者自定义验证逻辑、数据转换规则和请求/响应处理流程,极大地增强了框架的灵活性和可扩展性。 [![Zodios端到端类型安全REST API工具](https://raw.gitcode.com/gh_mirrors

gitblog_00542的博客 658
上一篇: 除了 postman,这个工具也可以查看全部的测试历史
下一篇: 完整又全面!在 Github Action 多平台构建 Electron 应用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值