HarmonyOS鸿蒙Next中动态读取JSON文件的代码,运行报错文件读取失败。

HarmonyOS鸿蒙Next中动态读取JSON文件的代码,运行报错文件读取失败。

import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { util } from '@kit.ArkTS';


// 定义多用户数据结构接口(数组类型)

// 定义用户数据结构
interface User {
  NAME: string;
  AGE: number;
}

interface UserData {
  users: User[]; // 明确使用users数组存储多组数据
}


// async
export  async function readAllUsers() {


  console.log(`1...`);

    try {

      console.log(`2...`);
      // 1. 读取JSON文件(使用__dirname确保路径正确)
      // 沙箱文件路径示例:/data/storage/el2/base/files/data.json
      //const filePath = getContext().filesDir + '/data.json';

      // 同步读取 rawfile 文件内容(返回 Uint8Array 数据)
      const rawFile = getContext().resourceManager.getRawFileContentSync("data.json");

      console.log(`3...`);
      // 将字节流转为字符串
      const decoder = util.TextDecoder.create('utf-8');
      const jsonStr = decoder.decodeToString(rawFile);
      console.log(`4...`);

      // 同步读取文件内容为字符串
      const jsonStr1 = fs.readTextSync(jsonStr);

      // 解析并处理数据
      let jsonData : UserData = JSON.parse(jsonStr1);
      let items: User[] = jsonData.users;
      console.log(`5...`);

      items.forEach((item: User) => {
        console.log(`name: ${item.NAME}, Age: ${item.AGE}`);
        console.log(`6...`);
      });
    }
    catch (error) {
      console.error('文件读取失败:', (error as BusinessError).message);
    }
}

更多关于HarmonyOS鸿蒙Next中动态读取JSON文件的代码,运行报错文件读取失败。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

通过日志查看
      // 解析并处理数据
      let jsonData : UserData = JSON.parse(jsonStr1);
      let items: User[] = jsonData.users;
      console.log(5...);

这部分代码没有执行,导致json文件读取失败

发现在getRawFileContentSync获取了文件内容后,又通过fs.readTextSync读取了一遍文件,而且是读取的沙箱路径,把内容作为路径又读取了一次,导致后续代码走不下去,注释掉fs.readTextSync那行代码后就能成功读取json文件了。

更多关于HarmonyOS鸿蒙Next中动态读取JSON文件的代码,运行报错文件读取失败。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,动态读取JSON文件失败通常是由于文件路径或权限问题导致。请检查以下关键点:

  1. 文件路径:确保使用正确的资源管理器路径,如$rawfile('filename.json')访问应用内的JSON文件。
  2. 权限配置:在module.json5中确认已声明文件访问权限,例如ohos.permission.READ_USER_STORAGE
  3. 文件位置:JSON文件需放置在项目的resources/rawfile目录下。
  4. 异步处理:使用resourceManager.getRawFileContent等API时,注意采用异步回调或Promise方式处理。

若路径和权限正确,可尝试使用fs模块的同步方法读取,如fs.readSync

你的代码混淆了两种文件读取方式,导致 fs.readTextSync(jsonStr) 这一行出现错误。jsonStr 已经是字符串,而 readTextSync 需要的是文件路径字符串。

在 HarmonyOS Next 中,动态读取 JSON 文件通常有两种场景,你的代码混合了它们:

1. 读取应用包内的资源文件(Rawfile) 这正是你代码前半部分所做的(getRawFileContentSync)。这种方式用于读取打包在应用内的、只读的静态文件。你的 data.json 文件需要放在工程的 resources/rawfile 目录下。

修正后的纯 Rawfile 读取方案:

import { BusinessError } from '@kit.BasicServicesKit';
import { util } from '@kit.ArkTS';

interface User {
  NAME: string;
  AGE: number;
}

interface UserData {
  users: User[];
}

export async function readAllUsers() {
  try {
    // 1. 同步读取 rawfile 目录下的 data.json 文件,得到 Uint8Array
    const rawFile = getContext().resourceManager.getRawFileContentSync("data.json");
    
    // 2. 将 Uint8Array 解码为字符串
    const decoder = util.TextDecoder.create('utf-8');
    const jsonStr = decoder.decodeToString(rawFile);
    
    // 3. 直接解析 JSON 字符串
    let jsonData: UserData = JSON.parse(jsonStr);
    let items: User[] = jsonData.users;
    
    items.forEach((item: User) => {
      console.log(`name: ${item.NAME}, Age: ${item.AGE}`);
    });
  } catch (error) {
    console.error('文件读取失败:', (error as BusinessError).message);
  }
}

2. 读取应用沙箱内的动态文件 如果你需要读取的是应用运行时创建或下载到沙箱内的文件(路径如 /data/storage/el2/base/files/data.json),则应使用 @kit.CoreFileKit 的 API。

沙箱文件读取方案示例:

import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';

interface User {
  NAME: string;
  AGE: number;
}

interface UserData {
  users: User[];
}

export async function readAllUsers() {
  try {
    // 构建沙箱内文件路径
    const filePath = getContext().filesDir + '/data.json';
    
    // 同步读取文件内容为字符串
    const jsonStr = fs.readTextSync(filePath);
    
    // 解析 JSON
    let jsonData: UserData = JSON.parse(jsonStr);
    let items: User[] = jsonData.users;
    
    items.forEach((item: User) => {
      console.log(`name: ${item.NAME}, Age: ${item.AGE}`);
    });
  } catch (error) {
    console.error('文件读取失败:', (error as BusinessError).message);
  }
}

关键点:

  • getRawFileContentSync 用于读取打包在 resources/rawfile/ 下的静态资源,返回 Uint8Array,需解码为字符串。
  • fs.readTextSync 用于读取应用沙箱路径下的文件,参数必须是有效的路径字符串。
  • 你的原始代码错误地将第一步得到的 JSON 字符串 jsonStr 作为路径传给了 fs.readTextSync

请根据你的 data.json 文件的实际存放位置,选择上述一种方案修改代码。如果文件在 rawfile 目录,用第一个方案;如果文件在应用沙箱内,用第二个方案。

回到顶部