OpenHarmony中的fastjson gson应该这样用

【问题背景】

随着越来越多的开发者开始投入北向应用的开发,无数的人开始问我:鸿蒙三方库是否有fastjson,是否有gson,当前json和对象的转换要怎么搞。

作为程序员,我的每个项目都逃不掉fastjson/gson等三方库,关键是看当前项目已经用了哪个,一般我也不会再自己新引入json库。 那么在OpenHarmony/HarmonyOS应用开发中,我的第一直觉告诉我,之前做网页/node开发时,貌似也没说有个fastjson/gson三方库。于是当时我找了下,其实在arkts开发时,沿用了js里自带的JSON,parse和JSON,stringify方法可以实现json和对象的转换,我也看了下早期确实有个开源三方库OpenHarmony-SIG/ohos_gson,我也看了下源代码,实现方式是参考gson的java代码,使用js重写。有人做过验证ohos_gson与JSON的转换的时间评测,结果是ohos_gson花费的时间是JSON的20倍以上。为了避免更多的应用入坑,因此ohos_gson到目前一直没发布到ohpm中心仓,所以别人一问我fastjson/gson的三方库的事情,我都答复用JSON去解决问题。

但是似乎问题没有完全解决,开发者越多,场景就越多。还是有很同学在反馈,说JSON并不能像fastjson/gson满足所有的需求,主要是以下几问题:
1.JSON.parse转过来的对象,不能带方法。比如class 中有个getName(){return this.firstName + this.lastName},这个方法就不能调用
2.JSON接收的json字段名称必须与本地对象属性名一致,能否重命名。
3.对象转JSON的时候,能否控制某些敏感字段不对外暴露。
4.属性是map或其他复杂结构体时,无法转换实现json与对象的互转

【解决方案】

对着上述的问题,我尝试google了一把,毕竟上述这些问题应该在web/node的开发场景下也会遇到。于是在更多的回复中,我看到业界建议更多的是用class-transformer来解决。这个库本身在OpenHarmony/HarmonyOS上正常跑,一行代码不用改,在三方库中心仓上可以直接下载到最新的0.51版本。
针对上述几个问题,我尝试了写了几段代码,验证了下,结果都是OK的。当然首先,需要

ohpm install class-transformer

那么接下来,我将给出代码,如何使用class-transformer来解决:
问题1:JSON.parse转过来的对象,不能带方法。
如以下代码所示,plainToClass可以把json转成对象后,可以调用getFullName的自定义方法

import { plainToClass } from 'class-transformer';class User {id: number;firstName: string;lastName: string;constructor() {this.id=0this.firstName=""this.lastName=""}getFullName() {return this.firstName + ' ' + this.lastName;}}let json = "{"id": 3,"firstName": "Tracy","lastName": "Mcgrady"}"JSON.parse(json)let user:User = plainToClass(User, JSON.parse(json))console.info(user.getFullName())   //输出Tracy Mcgrady

问题2:JSON接收的json字段名称必须与本地对象属性名一致,能否重命名。

这种场景还是很常见,比如网络传送的数据与应用本身持久化或者显示的数据,名字就是可能存在不同。这里需要用到@Expose注解来重命名,如以下代码可以把id转成uid,同时可以更改自定义方法getFullName的名字

import { classToPlain, Expose, plainToClass } from 'class-transformer';interface tranUser {uid: number,firstName: string,lastName: string}class User {constructor() {this.id= 0this.firstName= ""this.lastName= ""}@Expose({ name: 'uid' })id: number;firstName: string;lastName: string;@Expose({ name: 'fullName' })getFullName() {return this.firstName + ' ' + this.lastName;}}let json = "{"uid": 10,"firstName": "CCC","lastName": "Khudoiberdiev"}"let fromPlainUser:tranUser = JSON.parse(json)let user:User = plainToClass(User,fromPlainUser)console.info(JSON.stringify(user))// 输出{"id":10,"firstName":"CCC","lastName":"Khudoiberdiev"}console.info(JSON.stringify(classToPlain(user,{})))//输出{"uid":10,"firstName":"CCC","lastName":"Khudoiberdiev","fullName":"CCC Khudoiberdiev"}

3.对象转JSON的时候,能否控制某些敏感字段不对外暴露。

使用exclude注解可以搞定

import { classToPlain, Exclude } from 'class-transformer';class User {id: number;firstName: string;lastName: string;@Exclude()password: string;constructor() {this.id = 0this.firstName = "Tracy"this.lastName = "Macgrady"this.password = "12345"}}let user: User = new User()

4.属性是map或其他复杂结构体时,无法转换实现json与对象的互转

使用transform注解自定义方法转换搞定

import { classToPlain, plainToClass, Transform, TransformationType, TransformFnParams } from 'class-transformer';//关键方法:把对象转成Maptrans(value: TransformFnParams): Map<string, string> | object {if (value.type === TransformationType.PLAIN_TO_CLASS) {let map: Map<string, string> = new Map()for (let x of Object.keys(value.value)) {map.set(x, value.value[x])}return map}else {return value.value}}class User {id: number;firstName: string;lastName: string;@Transform((value: TransformFnParams) => this.trans(value), {})tags: Map<string, string> = new Map()constructor() {this.id = 0this.firstName = ""this.lastName = ""}}let json = "{"id": 3,"firstName": "Tracy","lastName": "Mcgrady","tags":{"key1":"value1","key2":"value2"}}"JSON.parse(json)let user: User = plainToClass(User, JSON.parse(json))console.info(user.tags.size.toString())\\输出2console.info(user.tags.get("key2"))\\输出value2console.info(JSON.stringify(user))\\输出 {"tags":{},"id":3,"firstName":"Tracy","lastName":"Mcgrady"}console.info(JSON.stringify(classToPlain(user, {})))\\输出{"tags":{"key1":"value1","key2":"value2"},"id":3,"firstName":"Tracy","lastName":"Mcgrady"}

【总结】
目前来看,使用系统自带JSON+三方库class-transformer,是可以满足类似gson/fastjson绝大部分的需求

此外,建议大家审视下自己设计的类和json是否合理,尽量避免使用复杂的转换。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习资料+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习资料(面试、文档、全套视频等)              

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六西格玛培训真相曝光:识别并避免这些常见陷阱!

在当今企业管理领域&#xff0c;六西格玛作为提升质量与效率的强大工具&#xff0c;其影响力日益增强&#xff0c;但伴随其普及的浪潮&#xff0c;一系列培训陷阱也悄然浮现&#xff0c;成为求学者路上的隐形障碍。作为深耕企业咨询领域的专家&#xff0c;张驰咨询特此为您揭秘…

FPGA在医疗方面的应用

可编程逻辑支持以灵活、低风险的方式成功实施系统设计&#xff0c;同时提供了最佳的成本效率和增值的差异化功能&#xff0c;延长了医疗保健应用的生命周期&#xff0c;包括诊断成像、电子医疗、治疗和生命科学与医院设备。 在医疗方面的应用非常广泛&#xff0c;以下是几个主…

【Prettier】代码格式化工具Prettier的使用和配置介绍

前言 前段时间&#xff0c;因为项目的prettier的配置和eslint格式检查有些冲突&#xff0c;在其prettier官网和百度了一些配置相关的资料&#xff0c;在此做一些总结&#xff0c;以备不时之需。 Prettier官网 Prettier Prettier 是一种前端代码格式化工具&#xff0c;支持ja…

SQL Server数据库 创建表,和表的增删改查

打开SQL Server工具,连接服务器 右击数据库&#xff0c;创建新的数据库 新建表 填写列&#xff0c;我添加了Id,Name,Sex,Age,和class列 右键表刷新一下就有了 我又同时创建了一个Class表 点击新建查询&#xff0c;现在写代码添加数据&#xff0c;也可以操作表来对数据进行添加 …

黑马JavaWeb企业级开发(知识清单DAY2完结)06——Vue(概述、指令、生命周期)

文章目录 前言一、Vue概述1. MVVM前端开发思想2. 框架是什么3. Vue介绍4. Vue快速入门 二、Vue常用指令三、Vue生命周期总结 前言 本篇文章是2023年最新黑马JavaWeb企业级开发&#xff08;知识清单DAY2完结&#xff09;06&#xff1a;Vue&#xff08;概述、指令、生命周期&…

设计模式篇(DesignPattern - 创建型模式)

目录 模式一&#xff1a;单例模式 一、简介 二、种类 1. 饿汉式(静态常量&#xff09; 1.1. 代码 1.2. 优缺点 2. 饿汉式&#xff08;静态代码块&#xff09; 2.1. 代码 2.2. 优缺点 3. 懒汉式(线程不安全) 3.1. 代码 3.2. 优缺点 4. 懒汉式(线程安全&#xff0c;…

GeoStudio2024:地质工程的瑰宝下载安装介绍

引言 青山隐隐&#xff0c;流水潺潺&#xff0c;吾心所向&#xff0c;乃地质之奥秘。GeoStudio2024&#xff0c;如同一卷古籍&#xff0c;蕴藏无尽智慧&#xff0c;助吾等探寻地质之真谛。今以李白之笔&#xff0c;述其妙用&#xff0c;愿与君共赏。 初识GeoStudio2024 初见…

港股震荡中保持乐观,市场信心回来了!

港股上午盘三大指数集体上涨&#xff0c;恒生科技指数一度冲高至1.54%&#xff0c;最终收涨0.98%&#xff0c;恒生指数上涨1.06%。盘面上&#xff0c;大型科技股多数维持上涨行情&#xff0c;百度、腾讯涨超1.5%&#xff0c;快手、美团小幅上涨&#xff0c;阿里巴巴、京东飘绿&…

没及格,我猜这套华为软件测试面试题没几个人能及格

一&#xff0e;填空 1、 系统测试使用&#xff08; C &#xff09;技术, 主要测试被测应用的高级互操作性需求, 而无需考虑被测试应用的内部结构。 A、 单元测试 B、 集成测试 C、 黑盒测试 D、白盒测试 2、单元测试主要的测试技术不包括&#xff08;B &…

layui栅格布局设置列间距不起作用

layui栅格布局支持设置列间距&#xff0c;只需使用预置类layui-col-space*即可。不过实际使用时却始终看不到效果。   根据layui官网文档的说明&#xff0c;只需要在行所在div元素的class属性中增加layui-col-space*即可出现列间距。如下图所示&#xff1a;   但是实际使用…

【数据结构】二叉树的顺序结构,详细介绍堆以及堆的实现,堆排序

目录 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆的结构 3.2 堆的初始化 3.3 堆的插入 3.4 堆的删除 3.5 获取堆顶数据 3.6 堆的判空 3.7 堆的数据个数 3.8 堆的销毁 4. 堆的应用 4.1 堆排序 4.1.1 向下调整建堆的时间复杂度 4.1.2 向上调整建…

GPT-4o System Card is released

GPT-4o System Card is released, including red teaming, frontier risk evaluations, and other key practices for industrial-strength Large Language Models. https://openai.com/index/gpt-4o-system-card/ 报告链接 企业级生成式人工智能LLM大模型技术、算法及案例实战…

MSSQLILABS靶场通关攻略

判断注入 首先用单双引号判断是否存在注入&#xff0c;这里可以看到是单引号 判断是否为 MSSQL 数据库 可以通过以下Payload来探测当前站点是否是MSSQL数据库&#xff0c;正常执行说明后台数据库为MSSQL&#xff1b;也可以根据页面的报错信息来判断数据库 and exists( select…

基于pygame的雷电战机小游戏

import pygame import sys import random# 初始化 Pygame pygame.init()# 设置窗口尺寸 WIDTH, HEIGHT 800, 600 screen pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("雷电战机")# 设置颜色 BLACK (0, 0, 0) RED (255, 0, 0) GREEN (…

对于现货白银走势图分析,不是单纯为了回报

投资白银选对工具和产品真的很重要。如果投资者选择的是实物银条&#xff0c;或者纸白银等相对低效的投资方式&#xff0c;收益只能跟随白银的价格涨跌&#xff0c;比如今年以来&#xff0c;国际白银价格上涨了大概30%&#xff0c;投资者的收益就顶多只有30%&#xff0c;万一买…

[数据集][目标检测]道路积水检测数据集VOC+YOLO格式2699张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2699 标注数量(xml文件个数)&#xff1a;2699 标注数量(txt文件个数)&#xff1a;2699 标注…

redis实战——go-redis的使用与redis基础数据类型的使用场景(一)

一.go-redis的安装与快速开始 这里操作redis数据库&#xff0c;我们选用go-redis这一第三方库来操作&#xff0c;首先是三方库的下载&#xff0c;我们可以执行下面这个命令&#xff1a; go get github.com/redis/go-redis/v9最后我们尝试一下连接本机的redis数据库&#xff0…

如何在Java Maven项目中使用JUnit 5进行测试

如何在Java Maven项目中使用JUnit 5进行测试 1. 简介 JUnit 5概述 JUnit是Java编程语言中最流行的测试框架之一。JUnit 5是JUnit的最新版本&#xff0c;它引入了许多新特性和改进&#xff0c;使得编写和运行测试更加灵活和强大。 为什么选择JUnit 5 JUnit 5不仅提供了更强…

设计模式反模式:UML图示常见误用案例分析

第一章 引言 1.1 设计模式与反模式概述 在软件开发领域&#xff0c;设计模式与反模式是两种截然不同的概念&#xff0c;它们在软件设计过程中起着至关重要的作用。设计模式是经过验证的最佳实践&#xff0c;用于解决在特定上下文中经常出现的问题&#xff0c;从而提高软件的可…

《黑神话·悟空》是用什么编程语言开发的?

最近火爆全球的国产 3A 大作《黑神话悟空》&#xff0c;你玩了吗&#xff1f;没玩没关系&#xff0c;有人就是对游戏不感冒&#xff0c;我找了个宣发片&#xff0c;一起感受下3A大作的视觉冲击&#xff0c;而且还是我们从小听到大&#xff0c;那猴子&#x1f412;的故事。 ‌‌…