HarmonyOS 鸿蒙Next 元服务对JSON的读写操作示例
HarmonyOS 鸿蒙Next 元服务对JSON的读写操作示例
有系统的json文件,我这里可以存储一些数据,但是现在要想对这个文件进行写入或修改操作就不会了。
元服务啊,希望好心人提供demo示例。
使用[@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
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<UserData>(<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 () => {
<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<UserData>(<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 () => {
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不行。
权限方面的操作,有具体文档可以发一下。
我看楼主意思与层主的代码示例,是说的首选项吗?
关于首选项可以参考文档preferences:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-preferences-V5
如果是resources目录下的文件是不支持修改的
只能新建json处理了。
对于HarmonyOS 鸿蒙Next元服务对JSON的读写操作,可以提供以下示例。
在HarmonyOS中,对JSON的读写操作通常涉及读取文件、解析JSON字符串以及将数据写回文件。首先,确保已经创建了鸿蒙开发项目,并添加了必要的依赖。
以下是一个基本的示例,展示了如何读取和写入JSON数据:
-
读取JSON数据:
- 使用
getResourceManager()
获取资源管理器实例。 - 使用
openRawFile()
方法打开本地JSON文件的输入流。 - 将输入流中的数据读取到字节数组中,并将其转换为字符串形式。
- 使用
ohos.utils.json.JSONObject
类解析JSON字符串。
- 使用
-
写入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