HarmonyOS鸿蒙Next打包后 JSON 解析异常,调试无问题

HarmonyOS鸿蒙Next打包后 JSON 解析异常,调试无问题

鸿蒙开发中 JSON.parse() 在 release 包下异常的问题

问题描述

我在使用 DevEco Studio 进行鸿蒙应用开发时,遇到了一个奇怪的问题:

  • DevEco Studio 中直接运行到真机(调试模式) 时,使用 JSON.parse() 解析json字符串数据一切正常;
  • 但是在 打包为 release 安装包(hap)并安装到真机运行 后,JSON.parse() 会报错,导致解析出来的数据显示出来全部是 undefined
  • 使用yunkss/ef_json试了一下,也是同样的问题

示例代码

let jsonStr = '{"name":"张三","age":30}';
let obj:Person = JSON.parse(jsonStr);
console.log(obj.name); // 调试模式下是 "张三",release 模式下是 undefined

希望得到的帮助

  • 希望有人能帮我定位和解决这个问题;
  • 想了解为什么 JSON.parse() 在调试模式下正常,但在 release 模式下却会出错;
  • 如果这是由于某些编译设置、混淆选项或语言特性导致的,希望能解释具体原因;
  • 如果有推荐的规避方式或配置方法,也请提供建议。

更多关于HarmonyOS鸿蒙Next打包后 JSON 解析异常,调试无问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可能是混淆导致的,检查下各个模块下 build-profile.json5 文件里 混淆配置 enable 选项。

如果确实需要混淆,则参考修改 华为开发者网站

否则,直接关掉混淆。

buildOptionSet": [
  {
    "name": "release",
    "arkOptions": {
      "obfuscation": {
        "ruleOptions": {
          "enable": false,
          "files": [
            "./obfuscation-rules.txt"
          ]
        }
      }
    }
  },
],

更多关于HarmonyOS鸿蒙Next打包后 JSON 解析异常,调试无问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next打包后JSON解析异常可能由以下原因导致:

  1. 混淆配置未排除JSON模型类,需在proguard-rules.pro中添加保持规则
  2. 多模块依赖冲突导致解析库版本不一致
  3. 打包时资源压缩导致JSON文件损坏
  4. 鸿蒙Next对JSON序列化/反序列化有特殊要求

排查步骤:

  • 检查release模式的混淆日志
  • 对比调试与打包环境的依赖版本
  • 验证原始JSON文件完整性
  • 使用@ohos.util.JSON工具类替代第三方库

这是一个典型的调试与发布环境差异导致的JSON解析问题。根据经验,可能的原因和解决方案如下:

  1. 混淆配置问题
  • 检查build-profile.json5中的release配置是否启用了代码混淆
  • 确保proguard-rules.pro中保留了JSON相关类的字段名不被混淆
  1. 类型声明问题: 调试时TypeScript类型检查较宽松,而release模式下更严格。建议修改为:
interface Person {
  name: string;
  age: number;
}
let obj = JSON.parse(jsonStr) as Person;
  1. 编译优化差异: 尝试在build-profile.json5中关闭release优化:
"buildOption": {
  "optimize": false
}
  1. 运行时环境差异: 某些JSON扩展特性在release模式下可能被禁用,确保使用标准JSON格式

  2. 替代方案: 可以尝试使用鸿蒙自带的util模块的JSON处理API:

import util from '@ohos.util';
let parser = new util.TextDecoder();
let obj = parser.decode(jsonStr);

建议先检查混淆配置,这是最常见的原因。如果问题依旧,可以逐步尝试其他解决方案。

回到顶部