【问题标题】:Convert string "object" to object [closed]将字符串“对象”转换为对象 [关闭]
【发布时间】:2020-04-20 12:21:35
【问题描述】:

我需要将inlineScriptsTexts 转换为对象,因为我需要从中获取值。但我不知道,如何将此字符串解析为对象。 [JSON.parse][1] 无法按预期工作。是否有一些解决方案,可以将此字符串转换为对象(如图像)?

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', }
        };

【问题讨论】:

  • 嗨! zvkDL 是 inlineScriptsTexts 的一个例子吗?
  • 你可以点击编辑,然后[<>]sn-p编辑并生成minimal reproducible example吗?
  • 如果您可以提供一个实际字符串内容的示例以及您希望将该字符串解析为什么,这将有助于澄清事情。
  • 你想用单引号来解析一个轻松的 JSON 字符串吗?像这样:Parsing string as JSON with single quotes?
  • 是的@lndgalante

标签: javascript json parsing


【解决方案1】:

所以我想帮忙

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>

【讨论】:

    【解决方案2】:

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

    在这种情况下,不能使用用于使用“JavaScript Object Notation”中的文本序列化一组受限数据对象的 JSON 字符串,因为 JSON 不支持序列化函数对象。

    eval 有两个主要的替代方案:

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

    调用eval或Function执行代码名声不好,在某些代码环境中会受到限制。

    在采取任何这些方法之前,我会准确分析问题:字符串来自哪里,首先通过创建脚本来进一步解决问题,是否会更好地克隆现有源对象而不先序列化它是可能的等等。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-21
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2020-03-30
      • 2013-02-16
      相关资源
      最近更新 更多