HarmonyOs开发:json转对象,一个插件轻松搞定!

前言

GsonFormat插件,想必开发过Java和Android的同学再熟悉不过,使用它可以快速的把指定的json数据转换为我们需要的对象,大大提高了我们的开发效率。

然而针对ArkTs语言,目前尚未有针对的插件,作为一个较早布局鸿蒙的开发者,这份职责自然要拦下,填补鸿蒙开发的空白,经过一天开发,测试验证后,于是,鸿蒙版的json转对象可以面向大家了。

本篇分享的内容大概如下:

1、两种方式实现json转对象

2、json转对象如何实现

3、相关总结

一、两种方式实现json转对象

针对json转对象,目前开发了两种方式,一种是在线的网页形式,需要自己把生成的对象,复制到项目中,另一种是,devecostudio IDE插件形式,在项目中直接使用,相对网页版来说,更加的便捷,具体如何抉择,看个人使用习惯。

1、网页版json转对象

地址:https://abnerming888.github.io/vip/json/json.html

打开网页之后,UI很是简单,左侧是json输入区域,点击中间的转换对象,就会把json转换为ArkTs对象,回显至右侧的区域,底部有复制按钮,可直接复制到项目中粘贴即可,右侧底部的输入框,是当前的对象名字,也就是类的名字,可以动态修改,记住,修改之后,务必重新点击转换对象按钮。

2、插件版json转对象

上述的网页版,右侧有一个下载插件地址,点击后,就跳转到了IDE插件安装页面,我们按照相关步骤一步一步安装即可,当然这里也给大家简单阐述一遍。

第一步,下载插件

大家可以点击上边的插件下载,或者点击下面的链接,插件下载之后,是一个jar包,大概40KB左右。

https://abnerming888.github.io/vip/json/jar/HarmonyJsonToObject-1.0.jar

第二步,安装插件

打开devecostudio IDE,找到设置页面,点击Plugins选项,然后再点击设置图标,点击安装本地插件选项,如下图所示:

选择第一步中下载好的插件,点击ok。

继续点击ok即可。

前两步执行完毕后,我们的插件就安装好了。

插件使用

插件安装好之后,在我们创建好的对象类中,就可以进行使用了,两种方式,一种是右键,选择第一个选项“鸿蒙json转对象”,另一种是快捷键Ctrl+ALt+P。

上述执行之后,会弹出如下的窗口:

和网页版有着异曲同工之处,上面的输入框是当前对象的名字,一般情况下非必要不要需要修改,直接就是你创建的对象文件名字,往下就是,左侧json输入区域,点击转换之后,会把json转换为右侧的对象可预览模式,在右侧如果你想要修改,可以手动修改,没问题之后,点击底部的确认按钮,就会把生成的对象,回显至当前文件中。

效果如下动图所示:


二、json转对象如何实现

如果对实现不感兴趣的,大家只需要关注第一项就可以,毕竟不需要定向开发的话,这个了解的意义不大。

无论把json转换为什么语言的对象,基本上思路都是一致的,都要去遍历json,获取对象的key和value,依据value的数据类型,来定义字段的类型格式,值得高兴的是,ArkTs的数据类型相对Java要少的多。

网页版,毋庸置疑,使用的是js来实现的,对json进行循环遍历,而遇到数组,只遍历首个即可,主要代码如下:

function loopTraversalJson(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 + "?: object\n";
                } 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 +loopTraversalJson(value);
                        temporaryObject = temporaryObject + "}\n";
                    } else {
                        //数组
                        let obj = "    " + key + "?: " + aCode + "[]\n";
                        //只创建属性,对象需要单独创建
                        eachJson = eachJson + obj;
                        //这里创建一个单独的对象
                        temporaryObject = temporaryObject + "\nexport class " + aCode +
                            " {\n";
                        temporaryObject = temporaryObject +loopTraversalJson(value[0]);
                        temporaryObject = temporaryObject + "}\n";

                    }
                }
            }
        }

        return eachJson;
    }

插件版,使用的是java语言,和js的实现逻辑一样,有一点不一样的是,java版遍历json其value可能存在多种类型,比如,value有可能是Integer,或者Float或者Double,而转化之后,统一就是number。

if (value instanceof Integer || value instanceof Float || value instanceof Double) {
                    //统一就是 number
                    endJson = endJson + "  " + key + "?:number\n";
                } else if (value instanceof String) {
                    endJson = endJson + "  " + key + "?:string\n";
                } else if (value instanceof Boolean) {
                    endJson = endJson + "  " + key + "?:boolean\n";
                } else if (value.toString().equals("null")) {
                    endJson = endJson + "  " + key + "?:object\n";
                } else if (value instanceof JSONArray) {
                    String upperCaseK = key.substring(0, 1).toUpperCase() + key.substring(1);
                    endJson = endJson + "  " + key + "?:" + upperCaseK + "[]\n";
                    forJsonValue(((JSONArray) value).getJSONObject(0), key);
                }

三、相关总结

目前插件版已提交jetbrains插件市场,审核过后,大家搜索HarmonyJsonToObject就可以搜到,当然了,未审核过之前,大家完全可以按照本地jar包安装进行使用,效果是完全一样的。

大家在使用过程之后,如果发现问题,可以及时告知,也希望鸿蒙版的json转对象,可以帮助到更多的鸿蒙开发者。

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在 Crow 库中,crow::json::rvalue 和 crow::json::wvalue 是两个不同的 JSON 类型,其中 crow::json::rvalue 是只读的 JSON 类型,而 crow::json::wvalue 是可写的 JSON 类型。 如果我们想要将 crow::json::wvalue 对象换为 crow::json::rvalue 对象,可以直接将它们的引用进行换,即: ```c++ const crow::json::rvalue& r = w; ``` 这里的 "w" 是一个 crow::json::wvalue 对象。 这种换方式非常简单,因为 crow::json::rvalue 是 crow::json::wvalue 的基类,可以直接将 crow::json::wvalue 对象换为 crow::json::rvalue 对象。 如果我们想要将 crow::json::rvalue 对象换为 crow::json::wvalue 对象,则需要使用 crow::json::rvalue 类的成员函数 `dump()` 将其序列化为 JSON 字符串,然后使用 crow::json::load() 函数将其反序列化为一个 crow::json::wvalue 对象,例如: ```c++ const crow::json::rvalue& r = ...; std::string json_str = crow::json::dump(r); crow::json::wvalue w; crow::json::load(w, json_str); ``` 这里的 "r" 是一个 crow::json::rvalue 对象,`crow::json::dump(r)` 将其序列化为 JSON 字符串,然后使用 `crow::json::load()` 函数将其反序列化为一个 crow::json::wvalue 对象 "w"。 需要注意的是,由于 crow::json::wvalue 对象是可写的,因此在换过程中可能会丢失一些信息。例如,如果 crow::json::rvalue 对象中包含一些只读的属性,这些属性在换为 crow::json::wvalue 对象时可能会被忽略。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员一鸣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值