Преобразовать строку объекта в JSON - PullRequest
157 голосов
/ 27 января 2012

Как я могу преобразовать строку, которая описывает объект, в строку JSON, используя JavaScript (или jQuery)?

Например: преобразовать это ( НЕ допустимая строка JSON):

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"

в это:

str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'

Я хотел бы избежать использования eval(), если это возможно.

Ответы [ 20 ]

2 голосов
/ 02 февраля 2018

Вам нужно использовать «eval», затем JSON.stringify, затем JSON.parse к результату.

 var errorString= "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
 var jsonValidString = JSON.stringify(eval("(" + errorString+ ")"));
 var JSONObj=JSON.parse(jsonValidString);

enter image description here

1 голос
/ 02 февраля 2018

Ваша лучшая и самая безопасная ставка будет JSON5 - JSON для людей .Он создан специально для этого варианта использования.

const result = JSON5.parse("{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }");

console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/json5/0.5.1/json5.min.js"></script>
1 голос
/ 27 января 2012

Вы должны писать круглые скобки, потому что без них eval будет рассматривать код внутри фигурных скобок как блок команд.

var i = eval("({ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] })");
0 голосов
/ 05 июня 2019

Использование новой функции () лучше, чем eval, но все же следует использовать только с безопасным вводом.

const parseJSON = obj => Function('"use strict";return (' + obj + ')')();

console.log(parseJSON("{a:(4-1), b:function(){}, c:new Date()}"))
// outputs: Object { a: 3, b: b(), c: Date 2019-06-05T09:55:11.777Z }

Источники: MDN , 2ality

0 голосов
/ 02 февраля 2018
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
0 голосов
/ 02 февраля 2018

Может быть, вы должны попробовать это:

str = jQuery.parseJSON(str)
0 голосов
/ 02 февраля 2018

Решение с одним регулярным выражением и без использования eval:

str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")

Я полагаю, что это должно работать для нескольких строк и всех возможных вхождений (/ g флаг) 'строки' в одинарных кавычках, заменяемой "строкой" в двойных кавычках.

0 голосов
/ 01 февраля 2018

var str = "{привет: 'мир', места: ['Африка', 'Америка', 'Азия', 'Австралия']}" var fStr = str .replace (/ ([A-z] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")

console.log (JSON.parse (Fstr)) enter image description here

Извините, я на своем телефоне, вот картинка.

0 голосов
/ 28 января 2018

Только для его причуд, вы можете конвертировать вашу строку через babel-standalone

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";

function toJSON() {
  return {
    visitor: {
      Identifier(path) {
        path.node.name = '"' + path.node.name + '"'
      },
      StringLiteral(path) {
        delete path.node.extra
      }
    }
  }
}
Babel.registerPlugin('toJSON', toJSON);
var parsed = Babel.transform('(' + str + ')', {
  plugins: ['toJSON']
});
var json = parsed.code.slice(1, -2)
console.log(JSON.parse(json))
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
0 голосов
/ 27 января 2018

В приведенном выше простом примере вы можете сделать это с помощью двух простых замен регулярных выражений:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
str.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
 => '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'

Большое предостережение : этот наивный подход предполагает, что у объекта нет строк, содержащих символ ' или :. Например, я не могу придумать хороший способ преобразовать следующую строку объекта в JSON без использования eval:

"{ hello: 'world', places: [\"America: The Progressive's Nightmare\"] }"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...