鸿蒙Next开发中如何实现JSON序列化及下划线与驼峰命名转换

在鸿蒙Next开发中,如何实现JSON数据的序列化和反序列化?特别是需要处理下划线命名与驼峰命名转换时,有没有推荐的库或原生API可以使用?例如,将Java对象转为JSON时自动将userName转为user_name,或者反向解析时能正确映射字段。希望能提供具体代码示例和最佳实践方案。

2 回复

鸿蒙Next里用@ohos.utilJSON.stringify()搞定序列化。下划线转驼峰?自己写个遍历函数,匹配_后字母大写就行。反着来就驼峰转下划线,遇到大写前插_并转小写。简单粗暴,代码量不到十行,稳!

更多关于鸿蒙Next开发中如何实现JSON序列化及下划线与驼峰命名转换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS Next)中,可通过以下方式实现JSON序列化及下划线与驼峰命名转换:

1. JSON序列化

使用@ohos.util@ohos.file.fs模块处理JSON数据:

import util from '@ohos.util';
import fs from '@ohos.file.fs';

// 对象转JSON字符串
let obj = { name: "张三", age: 25 };
let jsonStr = JSON.stringify(obj);

// JSON字符串转对象
let newObj = JSON.parse(jsonStr);

// 写入文件
let filePath = "xxx/test.json";
fs.writeTextSync(filePath, jsonStr);

2. 命名转换

方案一:手动转换函数

// 驼峰转下划线
function camelToSnake(obj: any): any {
  if (typeof obj !== 'object') return obj;
  
  return Object.keys(obj).reduce((acc, key) => {
    const snakeKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();
    acc[snakeKey] = camelToSnake(obj[key]);
    return acc;
  }, {});
}

// 下划线转驼峰
function snakeToCamel(obj: any): any {
  if (typeof obj !== 'object') return obj;
  
  return Object.keys(obj).reduce((acc, key) => {
    const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
    acc[camelKey] = snakeToCamel(obj[key]);
    return acc;
  }, {});
}

// 使用示例
const user = { userName: "LiHua", birthDate: "2000-01-01" };
const snakeUser = camelToSnake(user); // {user_name: "LiHua", birth_date: "2000-01-01"}

方案二:使用第三方库

package.json中添加依赖:

{
  "dependencies": {
    "lodash": "^4.17.21"
  }
}

使用示例:

import { camelCase, snakeCase } from 'lodash';

// 对象键名批量转换
function convertKeys(obj: any, converter: (key: string) => string): any {
  return Object.keys(obj).reduce((acc, key) => {
    acc[converter(key)] = obj[key];
    return acc;
  }, {});
}

const data = { user_name: "LiHua", birth_date: "2000-01-01" };
const camelData = convertKeys(data, camelCase); // {userName: "LiHua", birthDate: "2000-01-01"}

3. 完整流程示例

// 接口返回下划线数据 → 转驼峰 → 业务处理 → 转下划线 → 发送给服务端
const apiResponse = '{"user_name":"LiHua","order_list":[]}';

// JSON反序列化
const data = JSON.parse(apiResponse);

// 下划线转驼峰
const camelData = snakeToCamel(data);

// 业务处理...
camelData.userName = "WangWei";

// 驼峰转下划线
const finalData = camelToSnake(camelData);

// 序列化发送
const requestBody = JSON.stringify(finalData);

注意事项:

  1. 递归函数需处理数组和null的情况
  2. 考虑循环引用问题(可引入WeakMap解决)
  3. 重要数据建议编写单元测试
  4. 第三方库需检查鸿蒙兼容性

以上方案可根据具体业务需求选择实现方式,简单场景建议手动实现,复杂项目可使用成熟的工具库。

回到顶部