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

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

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

HarmonyOS
2024-08-28 09:31:39
1209浏览
收藏 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", ""]
// }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

### 方法二:使用 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);
// 输出同上
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

### 方法三:使用第三方库(如 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.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

### 防止数据崩溃

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

### 小结

  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}) 
    } 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
分享
微博
QQ
微信
回复
2024-08-28 23:17:52
相关问题
如何实现MapJSON字符串
2086浏览 • 1回复 待解决
如何将JSON字符串Class对象
1170浏览 • 1回复 待解决
HarmonyOS ASCII字符串
854浏览 • 1回复 待解决
HarmonyOS 字符串图片
914浏览 • 1回复 待解决
如何将JSON字符串Class对象数组?
1291浏览 • 1回复 待解决
ArrayBuffer怎样字符串
1214浏览 • 1回复 待解决
HarmonyOS Uint8Array格式字符串方法
1607浏览 • 1回复 待解决
HarmonyOS 超长JSON字符串解析
1341浏览 • 2回复 待解决
HarmonyOS uint8Array字符串
1087浏览 • 1回复 待解决
如何打印JSON对象和JSON字符串
1281浏览 • 1回复 待解决
HarmonyOS 十六进制字符明文字符串
775浏览 • 1回复 待解决
HarmonyOS 如何解析json字符串
1942浏览 • 1回复 待解决
如何解析JSON字符串
2290浏览 • 1回复 待解决
嵌套JSON字符串解析问题
2979浏览 • 1回复 待解决