鸿蒙中 JSON数据的处理

本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、JSON 处理方式

方式包/模块特点适用场景
内置 JSON 对象全局 JSON标准 Web API简单场景

核心方法

方法语法描述参数返回值
parse()JSON.parse(text[, reviver])解析 JSON 字符串text: 要解析的字符串
reviver: 可选转换函数
解析后的对象
stringify()JSON.stringify(value[, replacer[, space]])将值转换为 JSON 字符串value: 要转换的值
replacer: 可选过滤函数或数组
space: 可选缩进空格数或字符串
JSON 字符串

二、使用介绍

1. JSON.parse() - 字符串转对象

// 基础用法
const jsonString = '{"name":"张x","age":66,"isStudent":true}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // 张x
console.log(obj.age);  // 66

// 带 reviver 函数
const data = JSON.parse(jsonString, (key, value) => {
  if (key === 'age') {
    return value + 1; // 对特定字段进行处理
  }
  return value;
});
console.log(data.age); // 66

// 处理日期字符串
const jsonWithDate = '{"date":"2024-01-15T10:30:00.000Z"}';
const objWithDate = JSON.parse(jsonWithDate, (key, value) => {
  if (key === 'date') {
    return new Date(value);
  }
  return value;
});
console.log(objWithDate.date instanceof Date); // true

2. JSON.stringify() - 对象转字符串

const user = {
  name: "李x",
  age: 30,
  city: "北京",
  skills: ["TypeScript", "HarmonyOS"],
  profile: {
    level: "高级",
    experience: 5
  }
};

// 基础用法
const jsonStr = JSON.stringify(user);
console.log(jsonStr); 
// {"name":"李x","age":30,"city":"北京","skills":["TypeScript","HarmonyOS"],"profile":{"level":"高级","experience":5}}

// 带 replacer 参数
const filteredStr = JSON.stringify(user, ["name", "age"]);
console.log(filteredStr); // {"name":"李x","age":30}

// 带 replacer 函数
const customStr = JSON.stringify(user, (key, value) => {
  if (typeof value === 'string') {
    return value.toUpperCase();
  }
  return value;
});
console.log(customStr); // 所有字符串值转为大写

// 带缩进格式化
const prettyStr = JSON.stringify(user, null, 2);
console.log(prettyStr); // 格式化的 JSON 字符串

// 处理循环引用
const objA: any = { name: "A" };
const objB: any = { name: "B" };
objA.ref = objB;
objB.ref = objA;

try {
  JSON.stringify(objA); // 报错:循环引用
} catch (e) {
  console.error('循环引用错误:', e.message);
}

3. 实际应用

import { http } from '@kit.NetworkKit';

interface ApiResponse<T> {
  code: number;
  message: string;
  data: T;
  timestamp: number;
}

class ApiClient {
  private baseUrl: string;
  
  constructor(baseUrl: string) {
    this.baseUrl = baseUrl;
  }
  
  async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {
    let url = `${this.baseUrl}${endpoint}`;
    
    // 添加查询参数
    if (params) {
      const queryString = new URLSearchParams(params).toString();
      url += `?${queryString}`;
    }
    
    let request = http.createHttp();
    let response = await request.request(url, {
      method: http.RequestMethod.GET,
      header: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      }
    });
    
    if (response.responseCode === 200) {
      const responseText = response.result.toString();
      const apiResponse: ApiResponse<T> = JSON.parse(responseText);
      
      if (apiResponse.code === 0) {
        return apiResponse.data;
      } else {
        throw new Error(`API错误: ${apiResponse.message}`);
      }
    } else {
      throw new Error(`HTTP错误: ${response.responseCode}`);
    }
  }
  
  async post<T>(endpoint: string, data: any): Promise<T> {
    let request = http.createHttp();
    let response = await request.request(
      `${this.baseUrl}${endpoint}`,
      {
        method: http.RequestMethod.POST,
        header: {
          'Content-Type': 'application/json'
        },
        extraData: JSON.stringify(data)
      }
    );
    
    if (response.responseCode === 200) {
      const responseText = response.result.toString();
      return JSON.parse(responseText) as T;
    } else {
      throw new Error(`请求失败: ${response.responseCode}`);
    }
  }
}

// 使用示例
interface User {
  id: number;
  name: string;
  email: string;
}

const apiClient = new ApiClient('https://api.example.com');

// 获取用户列表
async function getUsers(): Promise<User[]> {
  return await apiClient.get<User[]>('/users');
}

// 创建新用户
async function createUser(userData: Partial<User>): Promise<User> {
  return await apiClient.post<User>('/users', userData);
}

鸿蒙系统中解析JSON数据并存储到集合里,可借助 `JSONUtil` 简化操作。因传统JSON处理方式存在类型安全问题、异常处理繁琐、对象转换复杂和 `Map` 数据结构支持不足等痛点,使用 `JSONUtil` 能更高效地完成任务 [^1]。 以下是一个示例代码,展示如何解析JSON数据并存储到集合中: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; import java.util.List; // 假设这是要解析的JSON数据 String jsonStr = "[{\"title\":\"标题1\",\"image\":\"图片1\",\"pubDate\":\"发布日期1\"},{\"title\":\"标题2\",\"image\":\"图片2\",\"pubDate\":\"发布日期2\"}]"; // 解析JSON数据并存储到集合中 List<JSONObject> jsonList = new ArrayList<>(); JSONArray jsonArray = JSON.parseArray(jsonStr); if (jsonArray != null) { for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); jsonList.add(jsonObject); } } // 遍历集合,输出解析结果 for (JSONObject obj : jsonList) { System.out.println("标题: " + obj.getString("title")); System.out.println("图片: " + obj.getString("image")); System.out.println("发布日期: " + obj.getString("pubDate")); System.out.println("----------------------"); } ``` 在上述代码中,先定义了一个JSON字符串 `jsonStr`,然后使用 `JSON.parseArray` 方法将其解析为 `JSONArray` 对象。接着,遍历 `JSONArray`,将每个 `JSONObject` 存储到 `List<JSONObject>` 集合中。最后,遍历集合,输出解析结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值