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)