JsonToArkTs
鸿蒙应用状态管理V2已经移除了GAP说明,目前新开发的功能都是使用V2版本的状态管理,也有一部分已经完成的功能准备迁移到 V2.
但在开发过程中,使用@ObservedV2装饰器时需要对每一个在UI中用到的属性加上@Trace装饰器,这纯纯的体力活,所以写了这个插件来自动生成这些代码。
使用方法
目前没有上线到应用市场,需要自行下载 jar 包安装。
安装文件在 release 文件夹下,下载后在 IDEA 中选择File->Settings->Plugins->Install Plugin from Disk选择下载的 jar 包即可安装。
当前将该插件菜单放在了generate菜单最后一项,点击后即可出现操作弹窗
格式化
点击Format按钮即可对编辑区域内的字符串进行格式化,方便查看。直接高亮,折叠等操作
如果字符串不合法,在 IDE 底部会有对应提示

生成代码
输入区域粘贴我们需要进行转换的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…