鸿蒙-DevEco插件:Json字符串转ObservedV2数据类

363 阅读3分钟

JsonToArkTs

鸿蒙应用状态管理V2已经移除了GAP说明,目前新开发的功能都是使用V2版本的状态管理,也有一部分已经完成的功能准备迁移到 V2.
但在开发过程中,使用@ObservedV2装饰器时需要对每一个在UI中用到的属性加上@Trace装饰器,这纯纯的体力活,所以写了这个插件来自动生成这些代码。

使用方法

目前没有上线到应用市场,需要自行下载 jar 包安装。
安装文件在 release 文件夹下,下载后在 IDEA 中选择File->Settings->Plugins->Install Plugin from Disk选择下载的 jar 包即可安装。

install_from_disk.png

当前将该插件菜单放在了generate菜单最后一项,点击后即可出现操作弹窗

JsonToArkTS.png

格式化

点击Format按钮即可对编辑区域内的字符串进行格式化,方便查看。直接高亮,折叠等操作 如果字符串不合法,在 IDE 底部会有对应提示 错误提示转存失败,建议直接上传图片文件

error_notification.png

生成代码

输入区域粘贴我们需要进行转换的json字符串,点击下方 Generate 即可在当前文件中生成对应的数据类代码。
默认类名为当前文件名,生成代码后会自动修改首字母大写的驼峰样式。
默认是会为每个类属性都加上@Trace装饰器,如果不需要可以取消with @Trace选项。
默认类属性是可空的,也就是说生成的代码会是这种样式。

@ObservedV2
export class Person{
  @Trace address?:Address
  @Trace name?:string
  @Trace age?:number
}

@ObservedV2
export class Address{
  @Trace zipCode?:number
  @Trace location?:string
}

如果不需要可空属性,可以选择with default value选项,生成的代码会是这种样式。

@ObservedV2
export class Person{
  @Trace address:Address = new Address()
  @Trace name:string = ""
  @Trace age:number = 0
}

@ObservedV2
export class Address{
  @Trace zipCode:number = 0
  @Trace location:string = ""
}

需要注意的地方

列表中的元素属性会被合并到同一个类中

例如我们有如下 json 字符串

{
  "name": "Huang",
  "age": 22,
  "order_list": [
    {
      "pay_method": "wx",
      "time": "2021-01-01 11:12:21",
      "id": "13323"
    },
    {
      "pay_method": "wx",
      "marked": "周末配送"
    }
  ]
}

order_list列表中,第一项有id属性,第二项有marked属性,这两个属性会被合并到同一个类中,生成的代码如下

@ObservedV2
export class FailedClassArticle{
  @Trace name:string = ""
  @Trace order_list:OrderList[] = []
  @Trace age:number = 0
}

@ObservedV2
export class OrderList{
  @Trace marked:string = ""
  @Trace pay_method:string = ""
  @Trace time:string = ""
  @Trace id:string = ""
}

不支持列表项为不同的类型

例如如下 json

{
  "order_list": [
    1,
    2,
    3,
    {
      "pay_method": "wx",
      "time": "2021-01-01 11:12:21",
      "id": "13323"
    },
    {
      "pay_method": "wx",
      "marked": "周末配送"
    }
  ]
}

虽然这是一个合法的 JSON 字符串,但是由于列表中的元素类型不同,前三项为数字,后两项为对象,会导致生成的代码不符合预期。

后续

上一次用 java 写 GUI 还是给框架写代码生成器,边扒拉IDEA 插件开发文档边写代码,还时不时的搜一下java swing 和 awt 的用法。
目前已知问题:编辑区域展示不全,也就是当 JSON 字符串过长或者格式化之后过长,无法滑动到最底部。不知道哪里的问题,但不影响代码生成。

  • 问啥时候修复?等 V3 出来的时候再写个新的吧。现在又不是不能用,哈哈哈
  • 问能不能同时支持 nullable 和 default value? 可以,但最近没时间,生成代码在JsonToClass#toCode()方法中,有需要的话自己修改一下吧,欢迎 pr。
  • 问源码在哪里? 不好意思,忘记放了,在 github 上,github.com/huangyuanlo…