Розбір рядка як JSON з одинарними лапками?


84

У мене є струна

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

Як я можу проаналізувати наведений вище рядок (str) на об’єкт JSON?

Це здається простим розбором. Однак це не працює.


7
Одиничні лапки неправильно відформатований JSON, так що якщо ви отримуєте що - щось подібне, ви, ймовірно , потрібно використовувати str.replace () і замінити окремі qoutes з " , перш ніж намагатися розібрати його
AUP

1
У будь-якому випадку завжди слід намагатися використовувати одинарні лапки для рядків у javascript. var str = "bad example";це не є доброю практикою, краще зробіть наступне: var str = 'good example';=> ось так, у вас не буде проблем з JSON, і у вас також не буде проблем з HTML. :)
ReeCube

3
@ReeCube Це здається трохи більше, ніж думка - з HTML все одно немає проблем, він приймає обидва. Для JSON, навіщо створювати його за допомогою рядків? Я насправді не згадую, коли востаннє я будував JSON з чогось іншого, крім об'єкта.
Дейв Ньютон,

2
@DaveNewton Я регулярно створюю json-рядки з node, python, php.
alfadog67

1
Думаю, я не розумію вашої думки. але добре
alfadog67

Відповіді:


86

Стандарт JSON вимагає подвійних лапок і не приймає одинарних лапок, а також парсер.

Якщо у вас є простий випадок, де у ваших рядках немає екранованих одинарних лапок (що, як правило, було б неможливо, але це не JSON), ви можете зробити це просто, str.replace(/'/g, '"')і ви повинні отримати дійсний JSON.


5
Ваша відповідь змінить дані. Хороша відповідь змінить структуру, а не дані всередині структури даних.
Тімоті Гонсалес,

3
@ssube, глобальна заміна одинарних лапок на подвійні - це перше, що спадає на думку і є методом зсуву, оскільки він може знищити значення словника. Наприклад 'title': "Mama's Friend", стане "title": "Mama"s Friend", що, звичайно, є недійсним! Я повинен проголосувати за вашу відповідь, але я проти. Цей коментар коштує набагато більше.
Апостолос

31

Я знаю, що це стара публікація, але для цього ви можете використовувати JSON5 .

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

8
Проголосував за те, що наведені вище рішення не зможуть отримати щось на кшталт: {'section': "24'"} котрий стає: {"section": "24""} і не розбере.
снедков

1
Це має бути головною відповіддю.
Сем Р.

Ідеальне рішення. Намагався зішкребти рядок JSON із тегу сценарію html, який містить розриви рядків і порожні пробіли. Врятував мій день!
DriLLFreAK100

Для мене це спрацювало<script>JSON.stringify(some_jsonString)</script>
jAntoni

12

Якщо ви впевнені, що ваш JSON надійно перебуває під вашим контролем (а не введенням користувача), ви можете просто оцінити JSON. Eval приймає всі типи пропозицій, а також назви властивостей без котирувань.

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

Додаткові дужки потрібні через те, як працює парсер eval. Eval не є злом, коли він використовується на даних, якими ви контролюєте. Детальніше про різницю між JSON.parse та eval () див. У розділі JSON.parse проти eval ()


2
Навіть якщо ви вважаєте, що eval у цьому випадку не є злом, JSON.parse завжди швидший: jsperf.com/json-parse-vs-eval/3
Arkanoid

@Arkanoid Орієнтовний показник, на який ви зв’язали, не застосовується до цього випадку, оскільки він використовує лише дійсний JSON (через JSON.stringify)
syockit

7

Щось на зразок цього:

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>



6

Використання одинарних лапок для ключів заборонено в JSON. Вам потрібно використовувати подвійні лапки.

Для вашого випадку використання, можливо, це було б найпростішим рішенням:

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

Джерело :

Якщо для властивості потрібні лапки, слід використовувати подвійні лапки. Усі назви властивостей повинні бути оточені подвійними лапками.


-12
json = ( new Function("return " + jsonString) )(); 

Поясніть, будь ласка, свої відповіді
Стерлінг Арчер,

3
Хлопці, ніколи не робіть цього. Це надзвичайно небезпечно
jpumford

Принципом використання Functionзамість eval є звук, але все інше - неправильно. Має бутиvar json = Function("'use strict';return " + jsonString)()
Джек Гіффін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.