从看起来像 jSon 格式的字符串中读取值

Read value from string which looks like jSon format

我以以下格式存储了 cookie 值

{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}

我需要阅读

的以下值
necessary
preferences
statistics
marketing

不确定如何正确读取值,我尝试了以下代码,假设它是 jSON 格式

        Cookies.get('CookieConsent')

        //Parse the cookie to Object

        cookieval = Cookies.get('CookieConsent');
        console.log(cookieval);

        console.log("Necessary: " + Boolean(cookieval.necessary));
        console.log("Prefrences: " + Boolean(cookieval.preferences));
        console.log("Statistics: " + Boolean(cookieval.statistics));
        console.log("Marketing: " + Boolean(cookieval.marketing));

但是这段代码总是returns false。

我使用以下 Jquery 来读取 Cookie 值 https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js

() 包裹这个字符串。然后像显示一样解析 follow

注意! 但您需要确保 input 字符串(从 cookie 接收)不包含错误代码。比如未知的注入函数。在这种情况下,该函数将在客户端浏览器上执行,可以访问私有数据(cookie、localStorage、来自 html-forms 的数据)。

const input = "{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}"
const object = eval("(" + input + ")");
alert(object.necessary);

你没有 JSON 格式 - 你有一些更接近 JS 对象文字表示法的东西,除了它是一个字符串而不是 JS 代码,所以很遗憾不能使用 JSON.parse

如果值没有逗号或冒号,您可以 split 逗号字符串和 reduce 到一个对象中:

const input = `{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}`;
const obj = input
  .slice(1, input.length - 1)
  .split(',')
  .reduce((obj, str) => {
    const [key, val] = str.split(':');
    obj[key] = val;
    return obj;
  }, {});
console.log(obj);

eval 是另一种选择,但不安全。

如何将字符串修改为适当的 JSON,将其解析为 JSON 对象,然后使用那里的字段?

它不太稳定,因为对输入字符串的更改可能会破坏函数,但它是安全的,因为它调用 JSON.parse() 而不是 eval()。

   function reformatCookieInput(inputString) {
    inputString = inputString.replace(/'/g, "");  //global strip out single quotes currently wrapping stamp
    inputString = inputString.replace(/,/g, `", "`); //global replace commas with wrapped commas
    inputString = inputString.replace(/:/g, `":"`); //same idea with colons
    inputString = inputString.replace("{", `{"`); //rewrap start of JSON string
    inputString = inputString.replace("}", `"}`); //rewrap end of JSON string

    return inputString;
}

const input = `{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}`;

const properJSONObject = JSON.parse(reformatCookieInput(input));
console.log(properJSONObject);