HarmonyOS鸿蒙Next开发者技术支持-从服务器接口返回json数据包含特殊字符如何解析处理

HarmonyOS鸿蒙Next开发者技术支持-从服务器接口返回json数据包含特殊字符如何解析处理 1.1 问题说明

从服务器接口返回json数据包含特殊字符,在鸿蒙中实体类bean 中,字段如果包含特殊字符直接报错

比如如下json数据: 包含特殊字符 -

{
  "cancel-job": "true",
}

在鸿蒙系统官网也明确 带特殊字符时错误的写法

1.2 原因分析

古老接口json返回的就是这种带特殊字符的

错误原因

JSON 规范限制

JSON 标准要求键名(key)必须使用双引号包裹,且键名不支持短横线 - 等特殊字符直接使用(如 “key-name”)。若字段名包含 - 且未正确处理,会导致解析失败。

ArkTS/TypeScript 对象语法差异 12

在 hvigorfile.ts 或 hvigorconfig.ts 等配置文件中,若将包含 - 的 JSON 字段直接用作对象属性(如 obj.key-name),会触发语法错误,因为 TypeScript 不允许属性名包含 -。

1.3 解决思路

记得安卓中是直接 重命名该字段, 通过在字段上添加*@SerializedName*注解来指定该字段在JSON中对应的名称

class JobInfo : Serializable {

    [@SerializedName](/user/SerializedName)("copies")
    var copies = 0

    [@SerializedName](/user/SerializedName)("document-name")
    var documentName: String = ""

    [@SerializedName](/user/SerializedName)("file-xfer-prog")
    var fileXferProg = 0
    }

在我们开发中理解在鸿蒙中肯定有对应的方法解决,经过在官方技术文档搜索

如何解析JSON字符串为实例对象-方舟编程语言(ArkTS)-ArkTS语言-应用框架开发-开发 - 华为HarmonyOS开发者

发现这篇文章,可以顺利将json数据解析为实力对象,

但是文章没有对字段包含特殊字符情况做单独说明

经过对源码的查看找到如下解决方案

1.4 解决方案

使用

"class-transformer@^0.5.1": "class-transformer@0.5.1",  去解析对用的json
 * Marks the given class or property as included. By default the property is included in both
 * constructorToPlain and plainToConstructor transformations. It can be limited to only one direction
 * via using the `toPlainOnly` or `toClassOnly` option.
 *
 Can be applied to class definitions and properties.
 
export declare function Expose(options?: ExposeOptions): PropertyDecorator & ClassDecorator;
[@Expose](/user/Expose)({ name: "job-id" })
jobId: number = 0;

第一步:

@Expose可以重新定义属性字段

最后用

let  strjson = "{\"m-align-completion\":10,\"sa-align-completion\":1,\"a-align-completion\":3}"
// 解析为实力类
 let data: AlignmentCompletionEntity = deserialize(Entity, strjson);
// 实例化
 let dataStr = serialize(data);

the last 在代码编写后发现 deserialize serialize两个方法已过期

最后使用最新方法:

    let data1: Entity = plainToClass(Entity, JSON.parse(strjson));
              let dataStr = JSON.stringify(instanceToPlain(data1));

1.5 成果总结

对直接由键名语法错误或格式问题引发的不能正常解析的问题可以得到解决,顺利展开下方工作

对老接口可以更好的兼容处理,有利于鸿蒙系统语言的进一步推广


更多关于HarmonyOS鸿蒙Next开发者技术支持-从服务器接口返回json数据包含特殊字符如何解析处理的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next中解析含特殊字符的JSON数据可使用系统提供的JSON序列化/反序列化能力。通过@ohos.util.parse模块的parse()方法可直接处理包含转义字符、Unicode字符等特殊符号的JSON字符串。该方法会自动处理字符转义,将JSON字符串转换为JS对象。若需严格验证,可配合try-catch捕获SyntaxError异常。对于Base64编码的二进制数据,需先使用@ohos.util.base64模块解码后再解析。

更多关于HarmonyOS鸿蒙Next开发者技术支持-从服务器接口返回json数据包含特殊字符如何解析处理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next开发中,处理JSON字段包含特殊字符(如短横线)的问题,可以通过使用class-transformer库的[@Expose](/user/Expose)注解实现字段映射。以下是具体解决方案:

  1. 定义实体类时使用@Expose注解

    import { Expose } from 'class-transformer';
    
    class JobInfo {
      [@Expose](/user/Expose)({ name: "cancel-job" })
      cancelJob: string = "";
    }
    

    通过name参数指定JSON中的原始字段名,避免ArkTS/TypeScript对象属性语法限制。

  2. 使用plainToClass和instanceToPlain方法

    import { plainToClass, instanceToPlain } from 'class-transformer';
    
    let jsonData = '{"cancel-job": "true"}';
    let jobInfo: JobInfo = plainToClass(JobInfo, JSON.parse(jsonData));
    let serializedData = JSON.stringify(instanceToPlain(jobInfo));
    
    • plainToClass:将JSON对象转换为类实例,自动处理字段映射。
    • instanceToPlain:将类实例序列化为JSON对象,保持字段映射关系。

此方法兼容JSON标准与ArkTS语法规范,无需修改服务端接口即可正确解析含特殊字符的字段。

回到顶部