HarmonyOS脚手架:快捷实现ArkTs中json转对象

前言

在上篇《HarmonyOS开发:UI开展前的阶段总结》中提到了未来的规划,既能让大家学会鸿蒙开发,也能让大家在以后的开发中如虎添翼,最终决定,便以脚手架为产出物,结合实际的业务需求,进行相关技术的输出,今天我们就带来脚手架的第一个功能,json转对象。

脚手架也是一个项目,包含了多个功能模块,以简单的功能为切入点,一点点的进行拓展增加,后续相关功能也会增加IDE插件,当然了,这都是后话了,万事开头难,万事坚持也难,做东西着急不得,一点点来吧。

本篇的文章大致如下

1、脚手架地址及使用方式

2、json转对象功能介绍

3、json转对象实现分析

4、相关总结

一、脚手架地址及使用方式

本来想打成Windows和Mac工具包,方便大家安装使用,但是转念一想,功能刚开始,以后也会不断地更新迭代,索性以项目地形式暴露给大家吧,使用起来也是非常地简单,等后续功能开发完毕了,可以打统一打安装包共大家使用。

温馨提示:只第一次需要执行前2步,前两步完成之后,后续只需要执行第3步即可。

第1步:使用git把项目clone到你的电脑中

大家可以按照自己习惯的方式进行下载,比如使用IDE,使用TortoiseGit工具,或者使用命令,都行,以下是命令的形式下载:

git clone https://github.com/AbnerMing888/HarmonyScaffolding.git

下载之后,目录如下,这些都是项目的源文件:

第2步:依次执行如下命令

由于缺乏安装包,所以第2步的作用就是,我们自己下载安装包,需要在项目根目录下执行如下命令:

安装 Electron

这个上篇文章有提及过,脚手架工具采用的是Electron进行开发的,它是一个使用 JavaScript、HTML 和 CSS 构建跨平台的桌面应用程序,既然要使用它,就需要进行安装,命令如下:

npm install --save-dev electron@^15.0.0

目前我是指定版本安装的,并配置在了package.json文件中devDependencies,主要用于开发阶段,大家可以和我的不一样,这个问题不大。

安装模块remote

remote 模块提供了一种在渲染进程和主进程之间进行进程间通讯的简便途径,使用 remote 模块,可以调用主进程对象的方法,而无需显式地发送进程间消息,这类似于 Java 的 RMI,虽然说13版本之后禁用了Remote模块,但是也提供了使用一个新的包 @electron/remote 来替代,一句话,主要用于dialog相关,比如弹窗,选择电脑路径等。

npm i -D @electron/remote

第3步:启动项目

npm start

执行之后,便能看到脚手架工具的启动页,如下所示:

二、json转对象功能介绍

使用npm start启动项目后,点击json转对象功能,便进入到如下页面,由于脚手架工具刚启动,其他功能还未开发,大家只可关注json转对象这一个功能即可。

功能区分了上下两块,上面是接口请求,下面是功能展示,可结合使用,也可单独使用。

单独使用

在输入json框中输入需要转对象的json数据,点击转换对象按钮,便可生成对应的ArkTs对象,直接可以复制到项目中使用。

右侧底部两个选项,一个是对象的名字,可以自己定义,一个是需要保存的模块,如何你不想复制,想直接保存到你的项目中,那么就可以选择要保存到项目中哪个模块下,这个需要和左侧的项目初始化功能结合使用。

如下图项目初始化功能,在这里你可以选择一个你的项目路径,到项目根目录即可,那么接下来,脚手架的所有功能都会生成到你选择的项目下,不用再一一的手动复制了。

还是回到json转对象功能,我们选择一个保存模块,当你选择你的项目路径后,便会遍历出你项目下所有符合的模块。

比如,我选择一个项目后,目录结构如下,那么符合保存的模块只有,entry和common。

当你点击选择保存模块后,就可以选择模块:

点击保存后:

回到项目查看,便生成到了你的项目下:

结合网络接口使用

顶部你可以输入你要请求的接口及相关参数,选择请求方式后,点击发起请求,便可把请求的json数据回显到下方的json框中,点击转换对象,便可直接生成对应的对象,之后的步骤,与上述就一致了。

三、json转对象实现分析

如何把一个json数据转化为我们需要的对象,需要做的是就是对json数据的遍历,遍历出所有的key和value,然后根据value值的类型,对应的转换为语言的对象即可,如,我们得到了一个字段code,它的值是0,那么在ArkTs中,便可以使用,code:number 来表示,Java中,便是,public int code; 来表示。

一个json数据,里面会有很多数据类型,所以,在代码编写的时候务必要考虑周全,如果json数据中有对象和数组,我们需要进行递归,这是不可忽视的。

生成ArkTs对象,对json数据类型判断如下,当然了如果你是其他语言,需要再做细化。

for (let key in json) {
            let value = json[key];
            if (typeof value == "number") {
              
            } else if (typeof value == "string") {
              
            } else if (typeof value == "boolean") {
               
            } else if (typeof value == "object") {
                //数组和对象都是 object
                let obj = JSON.stringify(value).substring(0, 1);
                if (obj === "{") {
                    //对象
                    
                }else{
                    //数组
                }
            }
        }

遍历中用一个变量作为存储,以ArkTs对象格式为依据,key:类型。

 if (typeof value == "number") {
                eachJson = eachJson + "    " + key + ": number\n";
            } else if (typeof value == "string") {
                eachJson = eachJson + "    " + key + ": string\n";
            } else if (typeof value == "boolean") {
                eachJson = eachJson + "    " + key + ": boolean\n";
            }

完整的json遍历如下:

 let temporaryObject = "";//临时的对象

    function forEachJson(json) {
        let eachJson = "";
        for (let key in json) {
            let value = json[key];
            if (typeof value == "number") {
                eachJson = eachJson + "    " + key + ": number\n";
            } else if (typeof value == "string") {
                eachJson = eachJson + "    " + key + ": string\n";
            } else if (typeof value == "boolean") {
                eachJson = eachJson + "    " + key + ": boolean\n";
            } else if (typeof value == "object") {
                //对象,判断是对象还是数组
                if (value == null) {//为空
                    eachJson = eachJson + "    " + key + ": String? = null";
                } else {
                    //不为空
                    let objFirst = JSON.stringify(value).substring(0, 1);
                    let aCode = key.substring(0, 1).toUpperCase();
                    aCode = aCode + key.substring(1, key.length);
                    if (objFirst === "{") {
                        //对象,首先创建类名
                        let obj = "    " + key + ": " + aCode + "\n";
                        //只创建属性,对象需要单独创建
                        eachJson = eachJson + obj;
                        //这里创建一个单独的对象
                        temporaryObject = temporaryObject + "\nexport class " + aCode +
                            " {\n";
                        temporaryObject = temporaryObject + forEachJson(value);
                        temporaryObject = temporaryObject + "}\n";
                    } else {
                        //数组
                        let obj = "    " + key + ": " + aCode + "[]\n";
                        //只创建属性,对象需要单独创建
                        eachJson = eachJson + obj;
                        //这里创建一个单独的对象
                        temporaryObject = temporaryObject + "\nexport class " + aCode +
                            " {\n";
                        temporaryObject = temporaryObject + forEachJson(value[0]);
                        temporaryObject = temporaryObject + "}\n";

                    }
                }
            }
        }

        return eachJson;
    }

四、相关总结

目前呢,脚手架工具刚开始,只完成了这样的一个单一功能,后续会不断的扩展,还请大家后续的关注,至于IDE插件,后续也会进入到日程之中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/167919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS进阶——高阶技巧

1、深浅拷贝 浅拷贝和深拷贝只针对引用类型 1.1 浅拷贝 浅拷贝:拷贝的是地址 如果是简单数据类型拷贝值,应用数据类型拷贝的是地址(简单理解:如果是单层对象,没问题,如果有多层就有问题) 常…

查询数据库DQL

DQL 查询基本语法 -- DQL :基本语法; -- 1查询指定的字段 name entrydate 并返回select name , entrydate from tb_emp;-- 2 查询 所有字段 并返回select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp;-- 2 查询…

15.ORACLE11g的归档方式和日志文件的相关操作

ORACLE11g的归档方式和日志文件的相关操作 一、什么是日志文件1、在线日志文件2、归档日志文件 二、Oracle 11g 归档方式:1、归档方式状态2、归档日志方式下数据库的工作原理3、配置归档日志方式3.1 开启归档模式3.2 日志文件相关操作: 4、oracle11g联机…

#gStore-weekly | gBuilder功能详解之结构化数据抽取

上一个weekly中已经详细讲解了schema的设计,在schema设计好了之后,gBuilder支持将结构化和非结构化数据转化为RDF图数据。其中结构化数据支持数据的无损转化。 1. 技术介绍 gBuilder的结构化数据抽取采用D2RQ技术实现。 DR2Q是一个能够将关系数据库中…

【23真题】很少见!第6题有点新颖!

今天分享的是23年太原理工大学801的信号与系统试题及解析。 本套试卷难度分析:该学校考察数字电路和信号与系统两部分,数字电路我没有知道,所以不知道难度。但是从信号部分来看,考察的知识点非常常见,对信号时域和频域…

基于Spring Boot 框架的试卷自动生成系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

11.16~11.19绘制图表,导入EXCEL中数据,进行拟合

这个错误通常是由于传递给curve_fit函数的数据类型不正确引起的。根据你提供的代码和错误信息,有几个可能的原因: 数据类型错误:请确保ce_data、lg_data和product_data是NumPy数组或类似的可迭代对象,且其元素的数据类型为浮点数。…

Altium Designer 相同模块的布局布线复用-AD

1、利用交互式布线,将两个相同模块的元器件在PCB上分块显示。 在原理图中,框选某一模块电路、按快捷键 TS 切换到PCB编辑界面、工具>器件摆放>在矩形区域内排列(可将模块中的器件都集中放置到矩形框内)。2、为模块电路添加 …

spring-boot-maven-plugin插件 —— 重新打包命名

如果需要重新打包的 jar 具有与项目的 artifactId 属性定义的本地名称不同的名称&#xff0c;只需使用标准 finalName&#xff0c;如下例所示&#xff1a; <build><!-- 打包重命名&#xff0c;打包后文件名称&#xff1a;项目名 --><finalName>${project.ar…

【如何让你的建筑设计更高效】推荐7个3DMAX建筑设计的实用插件

3DMAX是创建具有复杂对象和照片级真实感材质的大型三维项目的绝佳工具。它有用于粒子模拟和参数化建模的内置工具&#xff0c;只要有足够的时间和练习&#xff0c;你就可以创建任何东西。然而&#xff0c;总有改进的余地。许多第三方开发人员已经发布了自己的扩展&#xff0c;也…

课程设计:C++实现哈夫曼编码

功能实现&#xff1a; //1:先计算每个字符的权重//2&#xff1a;构建哈夫曼树//3&#xff1a;得出每个字符的哈夫曼编码。//4:根据哈夫曼编码转化为字符 代码实现&#xff1a; // 哈夫曼编码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //1:先计…

[ 云计算 | AWS 实践 ] 使用 Java 更新现有 Amazon S3 对象

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

用css实现原生form中radio单选框和input的hover已经focus的样式

一.问题描述&#xff1a;用css实现原生form中radio单选框和input的hover已经focus的样式 在实际的开发中&#xff0c;一般公司ui都会给效果图&#xff0c;比如单选按钮radio样式&#xff0c;input输入框hover的时候样式&#xff0c;以及focus的时候样式&#xff0c;等等&#…

C++学习笔记——C++ deque和vector的区别

C中的std::deque&#xff08;双端队列&#xff09;和std::vector&#xff08;向量&#xff09;是两种不同的容器类型&#xff0c;它们有以下区别&#xff1a; 内部实现方式不同&#xff1a;std::deque使用了一种双端队列的数据结构&#xff0c;它由多个块&#xff08;chunks&am…

软件外包开发需要注意的问题

软件外包开发是一种常见的业务模式&#xff0c;但在选择和合作外包团队时需要注意一些关键问题&#xff0c;以确保项目的成功和顺利进行。以下是一些在软件外包开发过程中需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux

先跑起来 &#x1f94a; Python 什么是 Python&#xff1f; Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…

C++ DAY03 类与对象

概述 对象&#xff1a;真实存在的事物 类&#xff1a; 多个对象抽取其共同点形成的概念 静态特征提取出的概念称为成员变量, 又名属性 动态特征提取出的概念称为成员函数, 又名方法 类与对象的关系 在代码中先有类后有对象 一个类可以有多个对象 多个对象可以属于同一个…

HashMap会用就行了?一文解决HashMap的底层问题

前言 我们的手机通讯录之所以能快速定位到特定联系人&#xff0c;就是因为它运用了HashMap底层的原理。手机通讯录将每个联系人的姓名作为键&#xff0c;电话号码作为对应的值&#xff0c;通过这个键值对的方式实现了快速的数据定位和获取。就像你通过关键字快速找到对应的联系…

vue动态配置路由

文章目录 前言定义项目页面格式一、vite 配置动态路由新建 /router/utils.ts引入 /router/utils.ts 二、webpack 配置动态路由总结如有启发&#xff0c;可点赞收藏哟~ 前言 项目中动态配置路由可以减少路由配置时间&#xff0c;并可减少配置路由出现的一些奇奇怪怪的问题 路由…

你学了Python之后让你成为行业卷王,升职加薪更有优势

都说Python能够实现自动化&#xff0c;那么Python具体能应用在哪些地方?哪些岗位学了Python更有优势?今天我们来看看一些大神将Python应用的出神入化的成果。 在这之前&#xff0c;先跟为大家分享个真实的故事。我朋友小宇前段时间为了一个品牌设计的大项目&#xff0c;想方案…