【js】递归解析json字符串

1、首先先要判断值是否为json字符串类型

const isJSON = (str) => {
    
    
    if (typeof str === 'string') {
    
    
        try {
    
    
            let obj = JSON.parse(str);
            if(typeof obj === 'object' && obj ){
    
    
                return true;
            }else{
    
    
                return false;
            }
        } catch() {
    
    
            return false;
        }
    }else {
    
    
        return false
    }
}

2、然后用一个递归,循环判断。

  • 若值是json,直接转;
  • 若不是,判断他是数组还是对象。
    1- 是数组,就要去循环数组,数组中只能放基本数据类型和对象
    1.1- 如果放的是基本数据类型,通常来说完全不用解析,但有一种情况:json字符串用typeof也是string类型,所以要解析这个json字符串,这个json字符串解析出来后可能里面的子级还有json字符串,所以要递归一下整个过程
    1.2- 如果放的是对象,那就循环这个对象,通过key拿到这个对象的每个属性值,对属性值在做判断
    1.2.1- 如果属性值是json字符串,就要解析,解析完了这个json字符串的子级可能还有json字符串,所以就要递归一下这个属性值
    1.2.2- 如果属性值不是json字符串,那就不用做任何操作
    2- 是对象,循环对象的每一个值,再次判断值是否是json字符串,是就要解析,解析完还要判断解析好的数据的子级是否还有json字符串…所以直接递归即可
const demo = ((val: any) => {
    
    
  let data
  if(isJSON(val)) {
    
    
    data = JSON.parse(val)
    demo(data)
  }else {
    
    
    if(typeof val === 'object') {
    
    
      if(Array.isArray(val)) {
    
    
        val = val.map((item: any) => {
    
    
          if(typeof item === 'object' && !Array.isArray(item)) {
    
    
            Object.keys(item).forEach(key => {
    
    
              if(isJSON(item[key])) {
    
    
                item[key] = JSON.parse(item[key])
                Object.assign(item, {
    
     [key]: item[key] })
                demo(item[key])
              }              
            })
          }else {
    
    
            demo(item)
          }
          return item
        })
      }else {
    
    
        Object.keys(val).forEach(key => {
    
    
          demo(val[key])
        })
      }
    }else {
    
    
      return false
    }
  }
  return data
})
let a = demo(str)
console.log(a)

猜你喜欢

转载自blog.csdn.net/bbt953/article/details/130373659