Считать значение из строки, которая выглядит как формат jSon

У меня есть значение 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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
790
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Оберните эту строку ( и ). Затем проанализируйте, как показано на дисплее

Внимание! Но вы должны быть уверены, что строка 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);

Этот способ работает надежно, покупать небезопасно. Метод из другого ответа работает только с простой входной строкой, но является безопасным.

vihtor 31.05.2018 09:16
Ответ принят как подходящий

У вас нет формата 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 или любое другое свойство, которое вам нужно.

CertainPerformance 31.05.2018 09:08

Спасибо console.info (обязательно);

Learning 31.05.2018 09:10

Как насчет преобразования строки в правильный 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);

Другие вопросы по теме