将从后台拿到的json串解析,会发现里面还有很多json串,
    image.png
    但这并不符合我们的需求,所以需要层层遍历,将里面的字符串给替换成解析过的对象或数组;

    抽离逻辑功能,思路如下:

    1、校验:确保我们从后台拿到的是一个字符串

    2、初次转换:将json串进行首次解析,等待深层解析

    3、深层转换:核心递归
    **

    • 遍历对象本层,判断属性类型;

      • hasOwnProperty来确保只读当前对象第一层属性;
    • 键对应值为字符串类型,判断是否有对象或数组的json串,有则替换成解析后的对象或数组;

      • 解析后,顺流往下执行 isObject 判断当前替换后的内容是否是一个对象,是则递归进行判断;
    • 键对应值为对象类型,进入该对象,继续判断对象的深层属性值。 ``javascript const jsonStr ={“rule_conf”:”{\“STORE\“:\“\“,\“PID\“:\“2088231092366820\“}”,”num”:1,”bizContent”: {“rule_conf”:”{\“STORE\“:\“\“,\“PID\“:\“2088231092366820\“}”,”amount”:1,”notify_uri”:”https://ministore-b-qa-saas.alixstar.com/coupon/callback/checkRuin/notify","brand_name":"fdsf","out_biz_no":1351090084443062273,"publish_start_time":"2021-01-18 04:52:01”,”voucher_quantity”:3,”publish_end_time”:”2021-02-17 04:52:01”,”voucher_type”:”CASHLESS_FIX_VOUCHER”,”voucher_description”:”[\“1、本券不可兑换现金,不可找零。\“,\“2、每个用户最多可以领取1张。\“,\“3、如果订单发生退款,优惠券无法退还。\“]”,”voucher_valid_period”:”{\“duration\“:2,\“unit\“:\“DAY\“,\“type\“:\“RELATIVE\“}”,”voucher_available_time”:”[]”,”floor_amount”:564}, “otherTextParam”: {“key”: “app_auth_token”, “value”: “202101BB4f356dbefbf24e2faad75ea9994f9X82”}}`

    const isString = (str) => str?.constructor === String const isObject = (obj)=> obj?.constructor === Object

    // 判断是数组或对象的json串 const needParse = (str) => (str.indexOf(‘{‘) !== -1 && str.lastIndexOf(‘}’) !== -1) || (str.indexOf(‘[‘) !== -1 && str.lastIndexOf(‘]’) !== -1)

    const deepParser = (str) => { // 校验 if (!isString(str)) return str // 初次转换 let base = JSON.parse(str) // 深层转换 const parser = (obj) => { Object.keys(obj).forEach((key) => { // 是字符串类型的需要再判断 if (Object.prototype.hasOwnProperty.call(obj, key)) { // json作为一种轻量级的数据转换格式,只支持数组和对象的数据结构,因此这里只对数组和对象的json串进行递归转换 isString(obj[key]) && needParse(obj[key]) && (obj[key] = JSON.parse(obj[key])) isObject(obj[key]) && parser(obj[key]) } }) } parser(base) return base }

    console.log(deepParser(jsonStr)) ```