HarmonyOS 鸿蒙Next 元服务对JSON的读写操作示例

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 元服务对JSON的读写操作示例

有系统的json文件,我这里可以存储一些数据,但是现在要想对这个文件进行写入或修改操作就不会了。

cke_1224.png

元服务啊,希望好心人提供demo示例。

15 回复

使用[@kit](/user/kit)这样呢?

类型定义文件 UserConfig.ets:

// UserConfig.ets  
export interface UserConfig {  
  userId: string;  
  preferences: {  
    theme: string;  
    fontSize: number;  
    notifications: boolean;  
  };  
  lastUpdated: string;  
}

创建配置服务 ConfigService.ets:

// ConfigService.ets  
import json from '[@kit](/user/kit).json';  
import fileio from '@ohos.fileio';  
import { UserConfig } from './UserConfig';  
import common from '@ohos.app.ability.common';  

export class ConfigService {
private context: common.UIAbilityContext;
private readonly CONFIG_FILE = ‘user_config.json’;

constructor(context: common.UIAbilityContext) {
this.context = context;
}

// 获取配置文件完整路径 private getConfigPath(): string {
return this.context.filesDir + ‘/’ + this.CONFIG_FILE;
}

// 读取配置 async readConfig(): Promise<UserConfig | null> {
try {
const path = this.getConfigPath();

  <span class="hljs-comment">// 检查文件是否存在  </span>
  <span class="hljs-keyword">try</span> {  
    await fileio.access(path);  
  } <span class="hljs-keyword">catch</span> {  
    <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;  
  }  

  <span class="hljs-comment">// 读取文件内容  </span>
  <span class="hljs-keyword">const</span> fileContent = await fileio.readText(path);  
  <span class="hljs-keyword">return</span> json.parse(fileContent) as UserConfig;  
} <span class="hljs-keyword">catch</span> (error) {  
  console.error(<span class="hljs-string">'读取配置失败:'</span>, error);  
  <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'配置读取失败'</span>);  
}  

}

// 保存配置 async saveConfig(config: UserConfig): Promise<void> {
try {
const path = this.getConfigPath();
const jsonString = json.stringify(config, null, 2); // 使用2空格缩进美化输出

  await fileio.writeText(path, jsonString);  
} <span class="hljs-keyword">catch</span> (error) {  
  console.error(<span class="hljs-string">'保存配置失败:'</span>, error);  
  <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'配置保存失败'</span>);  
}  

}

// 更新部分配置 async updateConfig(partialConfig: Partial<UserConfig>): Promise<void> {
try {
const currentConfig = await this.readConfig() || this.getDefaultConfig();
const updatedConfig = {
…currentConfig,
…partialConfig,
lastUpdated: new Date().toISOString()
};

  await <span class="hljs-keyword">this</span>.saveConfig(updatedConfig);  
} <span class="hljs-keyword">catch</span> (error) {  
  console.error(<span class="hljs-string">'更新配置失败:'</span>, error);  
  <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'配置更新失败'</span>);  
}  

}

// 获取默认配置 private getDefaultConfig(): UserConfig {
return {
userId: ‘’,
preferences: {
theme: ‘light’,
fontSize: 14,
notifications: true
},
lastUpdated: new Date().toISOString()
};
}
}

MainAbility.ets:

// MainAbility.ets  
import { ConfigService } from ‘./ConfigService’;
import common from ‘@ohos.app.ability.common’;

export default class MainAbility extends common.UIAbility {
private configService: ConfigService;

onCreate() {
this.configService = new ConfigService(this.context);
}

async onForeground() {
try {
// 读取配置示例 const config = await this.configService.readConfig();
console.info(‘当前配置:’, config);

  <span class="hljs-comment">// 更新配置示例  </span>
  await <span class="hljs-keyword">this</span>.configService.updateConfig({  
    preferences: {  
      theme: <span class="hljs-string">'dark'</span>,  
      fontSize: <span class="hljs-number">16</span>,  
      notifications: <span class="hljs-literal">true</span>  
    }  
  });  

  <span class="hljs-comment">// 验证更新后的配置  </span>
  <span class="hljs-keyword">const</span> updatedConfig = await <span class="hljs-keyword">this</span>.configService.readConfig();  
  console.info(<span class="hljs-string">'更新后的配置:'</span>, updatedConfig);  
} <span class="hljs-keyword">catch</span> (error) {  
  console.error(<span class="hljs-string">'配置操作失败:'</span>, error);  
}  

}
}

权限配置这里就省略了,这样应该没什么问题

权限配置别省略,帮我加上,特别是真机绝对能用的,就采纳你的了。

//json5权限 {
“module”: {
“requestPermissions”: [
{
“name”: “ohos.permission.READ_MEDIA”,
“reason”: “$string:read_media_permission”,
“usedScene”: {
“abilities”: [
“MainAbility”
],
“when”: “always”
}
}
]
}
}

报错的话给错误日志给我康康

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

元服务这个不好用,需要引用@kit.下面的包。@ohos不行。

重赏之下必有勇夫:
import dataPreferences from '@ohos.data.preferences';  
import { BusinessError } from '@ohos.base';  

/**

  • JSON数据操作服务类
    */
    export class JsonStorageService {
    private static instance: JsonStorageService;
    private preferences: dataPreferences.Preferences | null = null;
    private static readonly PREFERENCES_NAME = ‘app_storage’;

// 单例模式 private constructor() {}

public static getInstance(): JsonStorageService {
if (!JsonStorageService.instance) {
JsonStorageService.instance = new JsonStorageService();
}
return JsonStorageService.instance;
}

/**

  • 初始化存储服务
  • @param context 上下文
  • @returns Promise<void>
    */
    public async initialize(context: Context): Promise<void> {
    try {
    if (!this.preferences) {
    this.preferences = await dataPreferences.getPreferences(context, JsonStorageService.PREFERENCES_NAME);
    console.log(‘Storage service initialized successfully’);
    }
    } catch (error) {
    console.error(‘Failed to initialize storage service:’, error);
    throw error;
    }
    }

/**

  • 存储JSON数据

  • @param key 键

  • @param value 值

  • @returns Promise<void>
    */
    public async putJson<T>(key: string, value: T): Promise<void> {
    try {
    if (!this.preferences) {
    throw new Error(‘Storage service not initialized’);
    }

    // 将对象转换为JSON字符串 const jsonString = JSON.stringify(value);
    await this.preferences.put(key, jsonString);
    await this.preferences.flush();
    console.log(Successfully stored data <span class="hljs-keyword">for</span> key: ${key});
    } catch (error) {
    console.error(Failed to store data <span class="hljs-keyword">for</span> key ${key}:, error);
    throw error;
    }
    }

/**

  • 读取JSON数据

  • @param key 键

  • @param defaultValue 默认值

  • @returns Promise<T>
    */
    public async getJson<T>(key: string, defaultValue: T): Promise<T> {
    try {
    if (!this.preferences) {
    throw new Error(‘Storage service not initialized’);
    }

    const jsonString = await this.preferences.get(key, JSON.stringify(defaultValue));
    return JSON.parse(jsonString as string) as T;
    } catch (error) {
    console.error(Failed to retrieve data <span class="hljs-keyword">for</span> key ${key}:, error);
    return defaultValue;
    }
    }

/**

  • 删除指定键的数据

  • @param key 键

  • @returns Promise<void>
    */
    public async delete(key: string): Promise<void> {
    try {
    if (!this.preferences) {
    throw new Error(‘Storage service not initialized’);
    }

    await this.preferences.delete(key);
    await this.preferences.flush();
    console.log(Successfully deleted data <span class="hljs-keyword">for</span> key: ${key});
    } catch (error) {
    console.error(Failed to <span class="hljs-keyword">delete</span> data <span class="hljs-keyword">for</span> key ${key}:, error);
    throw error;
    }
    }

/**

  • 清除所有数据

  • @returns Promise<void>
    */
    public async clear(): Promise<void> {
    try {
    if (!this.preferences) {
    throw new Error(‘Storage service not initialized’);
    }

    await this.preferences.clear();
    await this.preferences.flush();
    console.log(‘Successfully cleared all data’);
    } catch (error) {
    console.error(‘Failed to clear data:’, error);
    throw error;
    }
    }

/**

  • 检查键是否存在

  • @param key 键

  • @returns Promise<boolean>
    */
    public async hasKey(key: string): Promise<boolean> {
    try {
    if (!this.preferences) {
    throw new Error(‘Storage service not initialized’);
    }

    return await this.preferences.has(key);
    } catch (error) {
    console.error(Failed to check key ${key}:, error);
    return false;
    }
    }
    }

// 使用示例 @Entry
@Component
struct Index {
private storage: JsonStorageService = JsonStorageService.getInstance();
@State userData: UserData = { name: ‘’, age: 0 };

// 示例数据接口 interface UserData {
name: string;
age: number;
}

async aboutToAppear() {
try {
// 初始化存储服务 await this.storage.initialize(getContext(this));

  <span class="hljs-comment">// 存储示例数据  </span>
  <span class="hljs-keyword">const</span> testData: UserData = {  
    name: <span class="hljs-string">"张三"</span>,  
    age: <span class="hljs-number">25</span>  
  };  
  await <span class="hljs-keyword">this</span>.storage.putJson(<span class="hljs-string">'user_data'</span>, testData);  

  <span class="hljs-comment">// 读取数据  </span>
  <span class="hljs-keyword">this</span>.userData = await <span class="hljs-keyword">this</span>.storage.getJson&lt;UserData&gt;(<span class="hljs-string">'user_data'</span>, { name: <span class="hljs-string">''</span>, age: <span class="hljs-number">0</span> });  
} <span class="hljs-keyword">catch</span> (error) {  
  console.error(<span class="hljs-string">'Failed to initialize or operate storage:'</span>, error);  
}  

}

build() {
Column() {
// 显示存储的数据 Text(姓名: ${<span class="hljs-keyword">this</span>.userData.name})
.fontSize(20)
.margin(10)

  Text(`年龄: ${<span class="hljs-keyword">this</span>.userData.age}`)  
    .fontSize(<span class="hljs-number">20</span>)  
    .margin(<span class="hljs-number">10</span>)  

  <span class="hljs-comment">// 存储新数据的按钮  </span>
  Button(<span class="hljs-string">'保存新数据'</span>)  
    .onClick(async () =&gt; {  
      <span class="hljs-keyword">const</span> newData: UserData = {  
        name: <span class="hljs-string">"李四"</span>,  
        age: <span class="hljs-number">30</span>  
      };  
      await <span class="hljs-keyword">this</span>.storage.putJson(<span class="hljs-string">'user_data'</span>, newData);  
      <span class="hljs-keyword">this</span>.userData = await <span class="hljs-keyword">this</span>.storage.getJson&lt;UserData&gt;(<span class="hljs-string">'user_data'</span>, { name: <span class="hljs-string">''</span>, age: <span class="hljs-number">0</span> });  
    })  
    .margin(<span class="hljs-number">10</span>)  

  <span class="hljs-comment">// 清除数据的按钮  </span>
  Button(<span class="hljs-string">'清除数据'</span>)  
    .onClick(async () =&gt; {  
      await <span class="hljs-keyword">this</span>.storage.clear();  
      <span class="hljs-keyword">this</span>.userData = { name: <span class="hljs-string">''</span>, age: <span class="hljs-number">0</span> };  
    })  
    .margin(<span class="hljs-number">10</span>)  
}  
.width(<span class="hljs-string">'100%'</span>)  
.height(<span class="hljs-string">'100%'</span>)  
.justifyContent(FlexAlign.Center)  

}
}

有帮助的话帮忙点个关注哈

元服务这个不好用,需要引用@kit.下面的包。@ohos不行。

引用@kit.下面的包。@ohos不行。

权限方面的操作,有具体文档可以发一下。

我看楼主意思与层主的代码示例,是说的首选项吗?

关于首选项可以参考文档preferences:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-preferences-V5

如果是resources目录下的文件是不支持修改的

元服务这个不好用,需要引用@kit.下面的包。@ohos不行。

resource目录下的资源文件不能修改

只能新建json处理了。

对于HarmonyOS 鸿蒙Next元服务对JSON的读写操作,可以提供以下示例。

在HarmonyOS中,对JSON的读写操作通常涉及读取文件、解析JSON字符串以及将数据写回文件。首先,确保已经创建了鸿蒙开发项目,并添加了必要的依赖。

以下是一个基本的示例,展示了如何读取和写入JSON数据:

  1. 读取JSON数据

    • 使用getResourceManager()获取资源管理器实例。
    • 使用openRawFile()方法打开本地JSON文件的输入流。
    • 将输入流中的数据读取到字节数组中,并将其转换为字符串形式。
    • 使用ohos.utils.json.JSONObject类解析JSON字符串。
  2. 写入JSON数据

    • 创建一个JSONObject对象,并使用put方法添加数据。
    • JSONObject对象转换为字符串。
    • 使用文件I/O API将字符串写入文件。

在HarmonyOS中,没有直接提供与安卓JsonReader完全对应的API,但开发者可以使用Java或Kotlin的文件I/O API读取文件内容,并结合如Jackson或Gson等库来解析JSON字符串。对于大文件,可以逐行或逐块读取内容,然后逐步解析,以避免一次性加载整个文件到内存中。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部