soiran
@soiran
Разработчик, Художник

В JavaScript. Как сконвертировать объект в виде строки в сам объект?

У меня есть строка "{cat: 5}", её нужно конвертировать в объект.
Подмечу то, что JSON.parse парсит только JSON-подобные строки. Тоесть:
let a = "{cat: 5}"
console.log(typeof JSON.parse(a)) // SyntaxError
let b  = '{"cat": 5}'
console.log(typeof JSON.parse(b)) // object

Есть ли способ реализовать это, не используя сторонних библиотек и метод eval?
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
const text = "{a:[1,2,{b:3}],c:{d:4},\"e\":\"qqq\"}";

const json = text.replace(/(?<=[\{,]\s*)([^",\{]*?)(?=\s*:)/g, a=>{
	return '"'+a+'"';
});

console.log(text); // {a:[1,2,{b:3}],c:{d:4},"e":"qqq"}
console.log(json); // {"a":[1,2,{"b":3}],"c":{"d":4},"e":"qqq"}

const obj = JSON.parse(json);


Александр, вот мой вариант, тоже наверное может сломаться (если в названии ключа должны быть запятая или левая фигурная скобка, а так же если одно из значений будет содержать что то типа "{cat: 5}"), но все остальные варианты отработает на ура
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@zkrvndm
Боты, парсеры, расширения
Чем вам eval не нравится? Вы всегда можете сгенирировать пустой фрейм и запускать eval там, чтобы он ничему не мешал.
Ответ написан
Alexandre888
@Alexandre888
Javascript-разработчик
ближе всего к реальности будет этот вариант:
var str = "{cat: 5}";
var items = [];

var tokens = str.match(/{[^}]+}/g);
for (var i = 0; i < tokens.length; i++) {
    var segments = tokens[i].split(',');
    var item = {};
    for (var j = 0; j < segments.length; j++) {
        var pair = segments[j].replace(/{|}/, '').split(':');
        item[pair[0].trim()] = pair[1];
    }
    items.push(item);    
}

var obj = items;
console.log(obj);

просто выходные данные подточите потом, и получите отличный объект.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
26 окт. 2020, в 10:27
30000 руб./за проект
26 окт. 2020, в 10:18
50000 руб./за проект
26 окт. 2020, в 10:08
5000 руб./за проект