将字符串“对象”转换为对象

时间:2020-04-20 12:21:35

标签: javascript json parsing

我需要将inlineScriptsTexts转换为对象,因为我需要从中获取值。但是我不知道如何将这个字符串解析为对象。 [JSON.parse][1]无法正常工作。有什么解决方案可以将该字符串转换为对象(如在图像上)?

img

window.onload = function() {
  let objExist = false;
  let inlineScripts = document.body;
  let inlineScriptsBlocks = Array.from(inlineScripts.getElementsByTagName('script'));
  inlineScriptsBlocks.forEach(scriptBlock => {
    let inlineScriptsTexts = scriptBlock.innerText;
    if (inlineScriptsTexts.includes('zvkDL')) {
      objExist = true;
      console.log(inlineScriptsTexts);
    }
  });

  //console.log(objExist);
}
zvkDL = {
            'language' : 'cs',
            'currency' : 'czk',
            'event': 'akurva',
            'ecommerce': {
                'purchase': {
                    'actionField': {
                        'id': 555,
                        'revenue': 535535,
                        'shipping': 3535,
                    }
                }
            },
            'eventCallback': function() {
                setGTMcookie( 555 ); // Jak se bude callback jmenovat nechám na vás. Jen to musí být srozumitelné. Pozor na scope JS callbacku.
            },
            'eventTimeout' : 2000,
            'eventCookie': { 'name': 'dasd', 'expires': 'asdsadd', 'value': 'funguje to', }
        };

2 个答案:

答案 0 :(得分:0)

JavaScript提供的方法是eval-用于执行包含JavaScript源代码的字符串。

在这种情况下,由于JSON不支持序列化功能对象,因此无法使用用于使用“ JavaScript对象表示法”中的文本序列化一组受限数据对象的JSON字符串。

eval有两种主要选择:

  1. 通过调用全局Function构造函数将文本转换为函数,或者
  2. 使用<script>标签将文本写入服务器上的文件并将其下载到浏览器。

调用evalFunction执行代码的信誉很差,并且在某些代码环境中可能会受到限制。

在采用上述任何一种方法之前,我都将精确地分析问题:字符串从何而来,通过首先创建脚本来更好地在源代码链中进一步解决问题,将克隆现有的源代码,会更好对象而无需序列化它首先是可能的,等等。

如果适用,还请注意:HTMLScriptElement的textContent仅在元素包含内联代码时才能用于访问代码。 textContent将不会返回下载的脚本文件的代码内容。

答案 1 :(得分:0)

所以我试图帮助

if (inlineScriptsTexts.includes('zvkDL '+'=')) {
  const str = inlineScriptsTexts.trim()
   .replace('zvkDL '+'=',"")
   .replace(/'/g,'"')
   .replace(/\/\/.*?\n/g,"")
   .replace(/\};/g,"}")
  console.log(str)
  console.log(JSON.parse(str));
}

但是该功能是一个大问题

// the reason it won't work:
// this is as good as a representation of the object as can be made

const obj =  {
    "language": "cs",
    "currency": "czk",
    "event": "akurva",
    "ecommerce": {
      "purchase": {
        "actionField": {
          "id": 555,
          "revenue": 535535,
          "shipping": 3535,
        }
      }
    },
    "eventCallback": function() { setGTMcookie(555); }, // this will NOT be seen by JSON

    "eventTimeout": 2000,
    "eventCookie": {
      "name": "dasd",
      "expires": "asdsadd",
      "value": "funguje to",
    }
  }
  console.log(JSON.stringify(obj))

/*


window.onload = function() {
  let objExist = false;
  let inlineScripts = document.body;
  let inlineScriptsBlocks = Array.from(inlineScripts.getElementsByTagName('script'));
  inlineScriptsBlocks.forEach(scriptBlock => {
    let inlineScriptsTexts = scriptBlock.innerText;
    if (inlineScriptsTexts.includes('zvkDL '+'=')) {
      const str = inlineScriptsTexts.trim().replace('zvkDL '+'=',"").replace(/'/g,'"').replace(/\/\/.*?\n/g,"").replace(/\};/g,"}")
      console.log(str)
      console.log(JSON.parse(str));
    }
  });
}*/
<script>
  zvkDL = {
    'language': 'cs',
    'currency': 'czk',
    'event': 'akurva',
    'ecommerce': {
      'purchase': {
        'actionField': {
          'id': 555,
          'revenue': 535535,
          'shipping': 3535,
        }
      }
    },
    'eventCallback': function() {
      setGTMcookie(555); // Jak se bude callback jmenovat nechám na vás. Jen to musí být srozumitelné. Pozor na scope JS callbacku.
    },
    'eventTimeout': 2000,
    'eventCookie': {
      'name': 'dasd',
      'expires': 'asdsadd',
      'value': 'funguje to',
    }
  };
</script>