OpenHarmony中的fastjson gson应该这样用

2024-08-26 22:20

本文主要是介绍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 最新全套视频教程

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

​​

总结

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

这篇关于OpenHarmony中的fastjson gson应该这样用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109841

相关文章

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

编程应该用 Mac 还是 PC ?

『有人的地方,就有江湖』—徐克。笑傲江湖。     序     一个竞争的市场,就会有对立的产生,这世界存在著很多不同的领域,领域好比是个江湖的缩影,因此就有许多门派的纷争,例如说浏览器领域有著最大宗的IE派,门派成长速度飞快,武功版号跳的跟台湾物价指数一样快的Chrome门,不断被模仿,一直被超越的Opera派;韧性极强,一直对抗几大势力的Firefox派等等,程序语言也有自己的领域

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException异常

用Gson解析json数据的时候,遇到一个异常,如下图: 这个异常很简单,就是你的封装json数据的javabean没有写对,你仔细查看一下javabean就可以了 比如:我的解析的代码是             Gson gson = new Gson();             ForgetJson rb = gson.fromJson(agResult.mstrJson, For

虚拟主机应该如何设置

假设我们在一个独立的环境下,现在我的根目录在D盘下的wamp下的www下!现在先来配置虚拟主机: 假设我们在一个独立的环境下,现在我的根目录在D盘下的wamp下的www下!现在先来配置虚拟主机: 1.先打开apache的配置文件httpd.conf,并去掉#Include 0conf/extra/httpd-vhosts.conf前面的#号。 2.打开apache的apach

为什么你应该从现在开始就写博客---刘未鹏

(一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处。(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极大损伤一样) 让我说得更明确一点:用博客的形式来记录下你有价值的思考,会带来很多好处,却没有任何明显的坏处。Note:碎碎念不算思考、心情琐记不算思考、唠唠叨叨也不算思考、没话找话也不算思考

Openharmony 图片自适应全屏显示

前言: Deveco_studio 4.1 release 版本 我们想要图片全屏显示,并且不出现黑白边,可以参考以下代码 这段代码会自适应你的容器大小,你的容器时全屏,图片就会全屏 @Entry@Componentstruct Index {@State message: string = 'Hello World';build() {Column() {}.width('100%'

教你如何应对算法备案难点以及备案后应该做什么?

教你如何应对算法备案难点以及备案后应该做什么? 自去年六月至今年八月,网信办已公布七批备案清单,共计1919项算法成功备案,标志着算法备案步入常态。主体备案虽门槛较低,算法备案却考验专业,尤其是《算法安全自评估报告》成为监管焦点,逾百项审查要点需逐一回应。算法数据的输入输出、模型架构、训练数据、策略逻辑与风险管理,每一环皆需详尽说明。下面,小编给大家着重讲讲互联网算法备案申请的难点以及备案