HarmonyOS 有没有方法在json转model时候就把null全换空字符串了

我在数据请求后给item传一个model进行赋值,会突然出现服务器返回的某一条数据是无值的,这种怎么防止崩溃呢

有没有方法在json转model时候就把null全换空字符串了

HarmonyOS
2024-08-28 09:31:39
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
鱼弦CTO
1

在 HarmonyOS 中,处理 JSON 数据时,将 ​​null​​​ 转换为空字符串是一种常见的需求。这可以防止在解析和使用数据时遇到 ​​null​​​ 引发的潜在问题。你可以通过手动遍历 JSON 对象来将所有的 ​​null​​ 值替换为空字符串,也可以利用一些库或框架中的功能实现这一点。

### 方法一:手动递归遍历

这是最基础的方法,通过递归遍历对象的所有属性,如果某个属性的值为 ​​null​​,则将其替换为空字符串。

#### 示例代码

function replaceNullWithEmptyString(obj) {
    if (obj === null) {
        return '';
    }

    if (typeof obj !== 'object') {
        return obj;
    }

    if (Array.isArray(obj)) {
        return obj.map(item => replaceNullWithEmptyString(item));
    }

    const newObj = {};
    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = replaceNullWithEmptyString(obj[key]);
        }
    }
    return newObj;
}

// 假设你有一个从服务器获取的JSON
const jsonData = {
    name: "John",
    age: null,
    address: {
        city: null,
        street: "123 Main St"
    },
    hobbies: [null, "reading", null]
};

const cleanedData = replaceNullWithEmptyString(jsonData);
console.log(cleanedData);
// 输出:
// {
//     name: "John",
//     age: "",
//     address: {
//         city: "",
//         street: "123 Main St"
//     },
//     hobbies: ["", "reading", ""]
// }

### 方法二:使用 JSON 序列化和反序列化

另一种方法是先将对象转换为 JSON 字符串,然后使用正则表达式替换 ​​null​​ 为 ​​""​​,再将其解析回对象。这种方式更简单,但也可能带来性能开销。

#### 示例代码

function replaceNullWithEmptyStringUsingJson(obj) {
    const jsonString = JSON.stringify(obj, (key, value) => (value === null ? "" : value));
    return JSON.parse(jsonString);
}

// 假设你有一个从服务器获取的JSON
const jsonData = {
    name: "John",
    age: null,
    address: {
        city: null,
        street: "123 Main St"
    },
    hobbies: [null, "reading", null]
};

const cleanedData = replaceNullWithEmptyStringUsingJson(jsonData);
console.log(cleanedData);
// 输出同上

### 方法三:使用第三方库(如 Lodash)

如果你使用了 Lodash,你可以利用它的 ​​_.cloneDeepWith​​ 方法自定义深拷贝逻辑来替换 ​​null​​。

#### 示例代码

const _ = require('lodash');

function customizer(value) {
    return value === null ? "" : undefined;
}

const jsonData = {
    name: "John",
    age: null,
    address: {
        city: null,
        street: "123 Main St"
    },
    hobbies: [null, "reading", null]
};

const cleanedData = _.cloneDeepWith(jsonData, customizer);
console.log(cleanedData);
// 输出同上

### 防止数据崩溃

要防止崩溃,可以在对数据进行有效性验证和默认值处理。确保你的应用程序能够优雅地处理来自服务器的异常数据。

### 小结

  1. 手动递归遍历:适合需要灵活处理复杂嵌套对象的场景。
  2. JSON 序列化和反序列化:简单快速,但可能有性能开销。
  3. 使用 Lodash 等第三方库:可以减少手动编码量,提升开发效率。

根据具体需求和项目情况选择最合适的方法。在请求数据后立即处理 ​​null​​ 值,可以有效避免后续操作中因 ​​null​​ 导致的问题。

分享
微博
QQ
微信
回复
2024-08-28 09:57:33
FengTianYa

JSON.parse处理可以使用reviver,可以参考以下代码:

class Student { 
  name: string = '' 
  age: number = 0 
} 
 
@Entry 
@Component 
struct Index { 
  @State jsonStr: string = '[{"name":null,"age":10},{"name":"xiaohong","age":null},{"name":"xiaohua","age":12}]' 
  @State jsonStrNoNull: string = '' 
  build() { 
    Column() { 
      Text(this.jsonStr).margin({bottom: 60}) 
 
      Button('转model去掉null').onClick(() => { 
 
        const arr: Student[] = JSON.parse(this.jsonStr, (key: string, value: string | number): void | string | number => { 
 
          if (key == 'name' && value == null) { 
            value = '' 
          } 
          if (key == 'age' && value == null) { 
            value = 0 
          } 
          return value 
        }) 
        this.jsonStrNoNull = JSON.stringify(arr) 
      }).margin({bottom:60}) 
 
      Text(this.jsonStrNoNull).margin({bottom: 60}) 
    } 
  } 
}
分享
微博
QQ
微信
回复
2024-08-28 23:17:52
相关问题
如何实现MapJSON字符串
1131浏览 • 1回复 待解决
如何将JSON字符串Class对象
467浏览 • 1回复 待解决
HarmonyOS 字符串图片
47浏览 • 1回复 待解决
如何将JSON字符串Class对象数组?
483浏览 • 1回复 待解决
ArrayBuffer怎样字符串
523浏览 • 1回复 待解决
HarmonyOS Uint8Array格式字符串方法
850浏览 • 1回复 待解决
HarmonyOS 如何解析json字符串
542浏览 • 1回复 待解决
如何打印JSON对象和JSON字符串
377浏览 • 1回复 待解决
HarmonyOS 十六进制字符明文字符串
173浏览 • 1回复 待解决
嵌套JSON字符串解析问题
2040浏览 • 1回复 待解决
如何解析JSON字符串
1264浏览 • 1回复 待解决
HarmonyOS 有没有方法直接退出APP
600浏览 • 1回复 待解决
如何将对象转为JSON字符串
568浏览 • 1回复 待解决
如何将Uint8Array字符串
598浏览 • 1回复 待解决