HarmonyOS 鸿蒙Next ArkTS如何读取本地json

HarmonyOS 鸿蒙Next ArkTS如何读取本地json

let json = require(’/Users/Documents/workspace/test.json’); console.log(json, ‘the json obj’);

上面的方式?

17 回复

楼主您好,关于文件读取的示例可以参考以下Demo链接:https://gitee.com/openharmony/applications_app_samples/tree/master/FileManager/FileIo

更多关于HarmonyOS 鸿蒙Next ArkTS如何读取本地json的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


请问使用 fileIo.openSync 读取本地 resources/rawfile 目录下的 JSON 文件或者其他目录下怎么写呢?

let readFd = fileIo.openSync(’…/pages/province.json’, 0o0) 这样试了也不行,

楼主您好,文件读取只支持沙箱路径,您可以参考一下以下链接: https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/apis/js-apis-fileio.md/

请问,读取本地文件的问题解决了吗?

还没弄完

import util from '@ohos.util'
import fileio from '@ohos.fileio'
import { CountryModel } from '../model/CountryModel'
import ArrayList from '@ohos.util.ArrayList'

@Entry
@Component
struct PanelExample {
  @State show: boolean = false
  private select: number = 1
  provinceArrayA: string[] = ['北京市', '天津市', '河北省', '山西省', '陕西省']
  cityArrayB: string[] = ['北京市', '天津市', '河北省', '山西省', '陕西省']
  areaArrayC: string[] = ['北京市', '天津市', '河北省', '山西省', '陕西省']
  options1Items: ArrayList<CountryModel> = new ArrayList
  options2Items: ArrayList<ArrayList<String>> = new ArrayList
  options3Items: ArrayList<ArrayList<ArrayList<String>>> = new ArrayList

  @PageLifecycle(PageStage.Show)
  onPageShow() {
    this.read_fileIo()
  }

  /// 
  /**
   * 读取路径
   * data/storage/el1/bundle/entry/resources/rawfile/province.json
   * 下的json文件内的省市区内容
   */
  private stream: fileio.Stream

  async read_fileIo() {
    let stat = fileio.statSync(globalThis.localFilePath);
    console.log('文件具体信息:' + stat.size)

    let readFd = fileio.openSync(globalThis.localFilePath, 0o0); //0o0代表只读打开文件
    this.stream = fileio.fdopenStreamSync(readFd, "r")
    let buf = new ArrayBuffer(stat.size) //文件大小
    let readOut = await this.stream.read(buf)

    let textDecoder = new util.TextDecoder("utf-8", { ignoreBOM: true }); //解决中文乱码问题
    let buffer = new Uint8Array(readOut.buffer)

    let readString = textDecoder.decode(buffer, { stream: false });
    console.log('文件内容:' + JSON.stringify(readString))

    var jsonBean: ArrayList<CountryModel> = JSON.parse(readString);
    this.options1Items = jsonBean;

    for (var index = 0; index < jsonBean.length; index++) {

      var cityList: ArrayList<String> = new ArrayList;
      var province_AreaList: ArrayList<ArrayList<String>> = new ArrayList;

      var cityArray = jsonBean[index].city;
      for (var c = 0; c < cityArray.length; c++) { //遍历该省份的所有城市

        var cityName = cityArray[c].name;

        cityList.add(cityName);
        var city_AreaList: ArrayList<String> = new ArrayList;
        var area = cityArray[c].area;
        for (var d = 0; d < area.length; d++) { //遍历
          city_AreaList.add(area[d]);
        }

        province_AreaList.add(city_AreaList);

      }

      /**
       * 添加城市数据
       */
      this.options2Items.add(cityList);

      /**
       * 添加地区数据
       */
      this.options3Items.add(province_AreaList);

    }

    this.options1Items.forEach((value, index) => {
      console.log("遍历数组一级A:" + value.name, index);
      console.log("遍历数组一级B:" + JSON.stringify(value.city), index);
      this.provinceArrayA.push(value.name);

    })
    this.options3Items.forEach((value, index) => {
      console.log("遍历数组三级级A:" + JSON.stringify(value), index);
    })

    this.stream.close()
    fileio.close(readFd)
  }

  build() {
    Column() {
      Text('2021-09-30    Today Calendar: 1.afternoon......Click for details')
        .width('90%')
        .height(50)
        .borderRadius(10)
        .backgroundColor(0xFFFFFF)
        .padding({ left: 20 })
        .onClick(() => {
          this.show = !this.show
        })

      Panel(this.show) { // 展示日程
        Column() {
          Row() {

            TextPicker({ range: this.provinceArrayA, selected: this.select })
              .layoutWeight(1)
              .onChange((value: string, index: number) => {
                console.info('Picker item changed, value: ' + value + ', index: ' + index)

                for (var i = 0;i < this.options2Items.length; i++) {
                  if (index == i) {
                    var a: ArrayList<string> = this.options2Items[i];
                    for (var index = 0; index < a.length; index++) {
                      const element = a[index];
                      this.cityArrayB.push(element)
                    }
                  }

                }

              })
            TextPicker({ range: this.cityArrayB, selected: this.select })
              .layoutWeight(1)
              .onChange((value: string, index: number) => {
                console.info('Picker item changed, value: ' + value + ', index: ' + index)
              })
            TextPicker({ range: this.areaArrayC, selected: this.select })
              .layoutWeight(1)
              .onChange((value: string, index: number) => {
                console.info('Picker item changed, value: ' + value + ', index: ' + index)
              })
          }
        }
      }
      .type(PanelType.Foldable)
      .mode(PanelMode.Half)
      .dragBar(true) // 默认开启
      .halfHeight(500) // 默认一半
      .onChange((width: number, height: number, mode: PanelMode) => {
        console.info(`width:${width},height:${height},mode:${mode}`)
      })
    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
  }
}

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

您可以这样做,但需要修改tsconfig.json。在tsconfig.json中有一个名为resolveJsonModule的设置。默认情况下,其值设置为false

TL;DR

  1. 打开tsconfig.json,如果resolveJsonModulecompilerOptions中不存在,则按如下方式添加它:

    "resolveJsonModule": true,
    
  2. 打开要读取文件并导入的组件,如下所示:

    import * as photos from '../../path-to file';
    

以上更改足以导入文件。

下面是一个示例:Stackblitz示例

上面的是网上的例子 ,但是我这个是api9的 该如何弄

apiType: ‘stageMode’,

我把json文件放在了resources/rawfile下

请问必须用json来存数据吗?可不可以直接用js对象来存?反正放在资源目录里面也没法修改。

北京市

  • 东城区
  • 西城区
  • 崇文区
  • 宣武区
  • 朝阳区
  • 丰台区
  • 石景山区
  • 海淀区
  • 门头沟区
  • 房山区
  • 通州区
  • 顺义区
  • 昌平区
  • 大兴区
  • 平谷区
  • 怀柔区
  • 密云县
  • 延庆县

天津市

  • 和平区
  • 河东区
  • 河西区
  • 南开区
  • 河北区
  • 红桥区
  • 塘沽区
  • 汉沽区
  • 大港区
  • 东丽区
  • 西青区
  • 津南区
  • 北辰区
  • 武清区
  • 宝坻区
  • 宁河县
  • 静海县
  • 蓟 县

如果直接用js对象,就不需要读取了。

在HarmonyOS鸿蒙系统中,使用ArkTS(Ark TypeScript)读取本地JSON文件可以通过文件系统API来实现。以下是基本的步骤:

  1. 获取文件路径:首先,确保你知道JSON文件的存储路径。如果是应用内的资源文件,路径通常是相对于应用的资源目录。

  2. 文件读取:使用file模块或相应的文件系统API来读取文件。ArkTS提供了封装好的文件操作接口,可以方便地读取文件内容。

  3. JSON解析:读取到文件内容后,使用JSON解析函数将字符串转换为JSON对象。ArkTS支持JSON解析,可以直接使用相关API。

示例代码(伪代码形式,具体API需参考ArkTS官方文档):

import file from '[@ohos](/user/ohos).file';

async function readLocalJson(filePath: string): Promise<any> {
    try {
        let data = await file.readFile(filePath, { encoding: 'utf8' });
        return JSON.parse(data);
    } catch (error) {
        console.error('Error reading JSON file:', error);
        throw error;
    }
}

// 使用示例
readLocalJson('/path/to/your/file.json').then(jsonObj => {
    console.log(jsonObj);
}).catch(err => {
    console.error('Failed to read JSON:', err);
});
``

请注意,上述代码为示例性质,具体实现需根据ArkTS的实际API进行调整。如果问题依旧没法解决请联系官网客服,官网地址是 [https://www.itying.com/category-93-b0.html](https://www.itying.com/category-93-b0.html)
回到顶部