2016-03-16 6 views
20

У меня есть строкаРазбор строки как JSON с одинарными кавычками?

str = "{'a':1}"; 
JSON.parse(str); 
VM514:1 Uncaught SyntaxError: Unexpected token '(…) 

Как я могу разобрать выше строки (строка) в формате JSON? Это похоже на простой синтаксический анализ; это не работает.

+3

Одиночные кавычки не правильно отформатированный JSON, так что если вы получаете что-то подобное, вы, вероятно, нужно использовать str.replace() и заменить отдельные qoutes с ", прежде чем пытаться разобрать его – aup

+0

Вы должны в любом случае, всегда старайтесь использовать одинарные кавычки для строк в javascript. 'var str =" bad example ";' не является хорошей практикой, лучше сделайте следующее: 'var str = 'good example';' => вот так вы не будете есть какие-то проблемы с JSON, и у вас тоже не будет проблем с HTML. :) – ReeCube

+1

@ReeCube Это похоже на мнение - в любом случае проблемы с HTML нет, он принимает оба. Для JSON зачем создавать его со строками? Я на самом деле не помню, как последний раз, когда я построил JSON из ничего, кроме объекта. –

ответ

4

Использование одиночных кавычек для ключей в JSON запрещено. Вам нужно использовать двойные кавычки.

Для вашего потребительной случае, возможно, это было бы самым простым решением:

str = '{"a":1}'; 

Source:

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

21

JSON standard требует двойных кавычек и не принимает одиночные кавычки и не будет синтаксический анализатор.

Если у вас есть простой случай без каких-либо одиночных кавычек в ваших строках (что обычно невозможно, но это не JSON), вы можете просто str.replace(/'/g, '"'), и вы должны закончить с действующим JSON.

+3

'str.repl ace ('\' ',' '') 'Это заменит только первое вхождение. –

+0

Это правильно, спасибо @ssube –

2

Что-то вроде этого:

var div = document.getElementById("result"); 
 

 
var str = "{'a':1}"; 
 
    str = str.replace(/\'/g, '"'); 
 
    var parsed = JSON.parse(str); 
 
    console.log(parsed); 
 
    div.innerText = parsed.a;
<div id="result"></div>

0

Если вы уверены, что ваш JSON безопасно под вашим контролем (не пользовательского ввода), то вы можете просто оценить JSON. Eval принимает все типы котировок, а также имена некотируемых свойств.

var str = "{'a':1}"; 
var myObject = eval('(' + str + ')'); 

Дополнительные скобки необходимы из-за того, как работает eval parser. Eval не злой, когда он используется на данных, которыми вы управляете. Более подробную информацию о разнице между JSON.parse и Eval() см JSON.parse vs. eval()

0

Я знаю, что это старый пост, но вы можете использовать JSON5 для этой цели.

<script src="json5.js"></script> 
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>