У меня есть значение 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.info(cookieval);
console.info("Necessary: " + Boolean(cookieval.necessary));
console.info("Prefrences: " + Boolean(cookieval.preferences));
console.info("Statistics: " + Boolean(cookieval.statistics));
console.info("Marketing: " + Boolean(cookieval.marketing));
Но этот код всегда возвращает false.
Я использую следующий JQuery для чтения значений cookie https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Оберните эту строку ( и ). Затем проанализируйте, как показано на дисплее
Внимание! Но вы должны быть уверены, что строка input (полученная из cookie) не содержит плохого кода. Например, неизвестная введенная функция. В этом случае функция будет выполняться в клиентском браузере с доступом к приватным данным (cookie, localStorage, данные из html-форм).
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.info(obj);eval - еще один вариант, но он небезопасен.
Запустите фрагмент кода - просто войдите в obj.preferences или любое другое свойство, которое вам нужно.
Спасибо console.info (обязательно);
Как насчет преобразования строки в правильный 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.info(properJSONObject);
Этот способ работает надежно, покупать небезопасно. Метод из другого ответа работает только с простой входной строкой, но является безопасным.