OpenHarmony中的fastjson gson应该这样用

news2024/11/16 21:38:56

【问题背景】

随着越来越多的开发者开始投入北向应用的开发,无数的人开始问我:鸿蒙三方库是否有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=0
          this.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= 0
          this.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 = 0
          this.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';

//关键方法:把对象转成Map
  trans(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 = 0
          this.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())\\输出2


      console.info(user.tags.get("key2"))\\输出value2

      console.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.coloradmin.cn/o/2076247.html

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

相关文章

C++基础知识5 string

string 1. string类1.1 C语言中的字符串 2. 标准库中的string类2.1 string类(了解)2.2 auto和范围for2.3 string类的常用接口说明 3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数6. vs和g下string结构的说明7. string类的模拟实现8.写时拷贝(…

认知杂谈35

今天分享 有人说的一段争议性的话 I 《日常藏宝&#xff0c;多留意》 嘿&#xff0c;你想想看哈&#xff0c;生活里那些让咱佩服得不行的小窍门&#xff0c;其实都藏在咱平常的小事儿里呢。 I 就好比啊&#xff0c;很多有用的道理其实就在咱身边晃悠&#xff0c;就看咱有没有…

nginx访问控制、用户认证、https

nginx访问控制 用于location段 Allow&#xff1a;设定允许哪台或哪些主机访问&#xff0c;多个参数间用空格隔开 Deny&#xff1a;设定禁止那台或哪些主机访问&#xff0c;多个参数间用空格隔开 //deny [rootnginx ~]# vim /usr/local/nginx/conf/nginx.conflocation /stat…

【数据结构篇】~链式二叉树(附源码)

链式二叉树 前言&#xff08;含头文件&#xff09;头文件 1.链式二叉树的组成2.前、中、后、层序遍历1.前序遍历2.中序遍历3.后序遍历 3.结点个数以及高度等​4.判断二叉树是否为完全二叉树 前言&#xff08;含头文件&#xff09; 之前的堆是特殊的二叉树是顺序结构的二叉树&a…

python库(20):Jsonschema库描述JSON数据的规范

1 Jsonschema简介 在当今信息时代&#xff0c;数据规范与交换变得越来越重要&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络通信与前后端数据交互。 JSON Schema是一种用于描述JSON数据的规范…

计算机二级题--函数(scanf)章节

1.scanf函数 1. 2. A:默认使用scanf函数的时候&#xff0c;如果空格&#xff0c;回车或跳格就结束了&#xff0c;不能再继续输入了 (同上知识点&#xff09;

【JavaEE初阶】HTTP协议与使用Fiddler抓包

目录 &#x1f38d;HTTP协议是什么&#xff1f; &#x1f340;应用层协议&#xff08;HTTP&#xff09;存在的意义 &#x1f384;HTTP 协议的工作过程 &#x1f334;HTTP 协议格式 &#x1f333;Fiddler抓包工具的使用 &#x1f6a9;如何抓HTTPS的包&#xff1f; &#…

“视频号小店分销:让你的微信小店也能分销”

在数字时代的浪潮中&#xff0c;微信视频号利用其深厚的社交根基和庞大的用户基础&#xff0c;正逐渐成为新零售领域的一股新兴力量。特别是其视频号小店功能的推出&#xff0c;为商家提供了一个集商品展示、销售促进和营销策略于一体的全方位运营平台&#xff0c;实现了业务流…

医疗器械法规笔记

目录 前言医疗器械法规体系医疗器械监管注册与备案前言 之前的文章中介绍了与软件开发过程中相关的法规(网络安全),同时介绍了如何查找相关行业标准,这些都是平时工作中遇到的细节问题,没有系统性的呈现出医疗器械法规相关的框架,一直想对法规与标准有一个全面的认识和总…

java之继承与多态 1

1.继承的概念&#xff1a;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法&#xff0c;从而实现代码的重用和扩展。 父类&#xff08;超类&#xff09;&#xff1a;被继承的类。子类&#xff1a;继承父类的类。子类可以访问父…

OpenHarmony实战开发:Launcher应用安装问题分析报告

1 关键字 Launcher&#xff1b;Storage 2 问题描述 问题现象&#xff1a;安装应用到达 20 个以上后&#xff0c;重启设备&#xff0c;Launcher 页面没有任何应用图标 运行环境&#xff1a;硬件 dayu200&#xff0c;软件&#xff1a;3.1release 测试步骤&#xff1a; 使用…

DrawDB数据库设计工具本地部署结合内网穿透实现团队异地协作办公

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言…

Redis集群技术

目录 一、Redis安装部署 二、Redis主从复制 三、Redis哨兵模式 1、开启Redis哨兵模式 2、Redis哨兵模式选举MASTER全过程 3、Redis哨兵模式数据丢失风险的解决方案 四、Redis Cluster 1、Redis集群部署 2、Redis集群扩容 1、加入MASTER集群 2、分配槽位 3、添加slav…

Linux:开发工具(3)

一、版本控制器git 安装git指令 yum install git 1.1 举例理解版本控制器 举个例子&#xff1a; 比方说老师要求我们交一份实验报告&#xff0c;而你的室友张三是一个非常勤奋的人&#xff0c;所以他很早就写好了第一版交给老师&#xff0c;但老师的要求很高&#xff0c;他觉得…

将 github 仓库同步到个人服务器

场景 把本地项目推送到Github仓库后&#xff0c;如果想部署到服务器上&#xff0c;可以尝试此方案 我的博客是hugo搭建的&#xff0c;每次更新文章会手动推送到Github仓库&#xff0c; 然后利用Actions 脚本自动推送到cf或者vercel 之前我写过一篇 将 hugo 博客搬迁到服务器…

STM案例一:灯闪烁

一、使用元件 STlink&#xff0c;STM32F103C8T6 二、接线方法 STM32与STLINK的接线方法为&#xff1a; GND-->GND DCLK-->SWCLK DIO-->SWDIO 3.3-->3.3V 三、配置调试器 选择魔术棒按钮&#xff0c;单击Debug&#xff0c;选择ST-link Debug&#xff0c;选…

免费JSON在线解析工具网址

1&#xff0c;https://tool.juhe.cn/ JSON在线解析 (juhe.cn) 2&#xff0c;https://www.sojson.com/ JSON在线 | JSON解析格式化—SO JSON在线工具

阿卡迈2.0逆向

阿卡迈&#xff08;akamai&#xff09;我也是第一次第一次搞 阿卡迈检测挺多例如 ua 屏幕 document 自动化检测等等 &#xff0c;还有tls指纹 仅供学习参考吧 当cookie的_abck为 0表示通过&#xff0c;1表示不通过&#xff01;&#xff01;&#xff01; 测试了两个2.0站全都通…

一款特别牛逼还免费的屏幕演示批注注释工具,教学演示工具

功能强大&#xff0c;还免费&#xff01;PEVO Annotator 是一款功能强大的屏幕标注软件&#xff0c;广泛应用于教学演示、屏幕录像等场景。该软件支持多种操作系统&#xff0c;包括 macOS 和 Windows 。它提供了丰富的工具和功能&#xff0c;如画笔、直线、圆形、方形等形状绘制…

【海思3516DV500 | 开发环境】编译整个SDK全过程以及问题汇总

一、开发环境 上表是海思提供的Hi3519DV500 开发环境的各部分软件描述&#xff0c;实际用起来你就知道&#xff0c;可能有出入&#xff0c;尝试换Ubuntu 20.04折腾了好几天都不行&#xff0c;使用推荐的Ubuntu 18.04.2 64bit一个上午就行。 基本的硬件要求如下&#xff1a; ●…