작은 따옴표를 사용하여 문자열을 JSON으로 구문 분석합니까?


84

나는 끈이있다

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

위의 문자열 (str)을 JSON 객체로 어떻게 구문 분석 할 수 있습니까?

이것은 단순한 구문 분석처럼 보입니다. 그래도 작동하지 않습니다.


7
작은 따옴표는 정확하게 당신이 뭔가를 수신하는 경우 그래서, 당신은 아마 사용 str.replace (필요)과 구문 분석을 시도하기 전에 "단일 qoutes를 대체 할 것, JSON 포맷되지 않습니다
AUP

1
어쨌든 자바 스크립트의 문자열에는 항상 작은 따옴표를 사용해야합니다. var str = "bad example";좋은 습관이 아니라면 다음을 수행하는 것이 좋습니다. var str = 'good example';=> 이렇게하면 JSON에 문제가없고 HTML에도 문제가 없습니다. :)
ReeCube 2016 년

3
@ReeCube 그것은 의견에 불과한 것 같습니다. 어쨌든 HTML에는 문제가 없으며 둘 다 받아들입니다. JSON의 경우 어쨌든 문자열로 생성하는 이유는 무엇입니까? 나는 실제로 객체 이외의 다른 것으로 JSON을 마지막으로 만들었을 때를 기억하지 않습니다.
Dave Newton

2
@DaveNewton 정기적으로 노드, 파이썬, PHP에서 json 문자열을 만듭니다.
alfadog67

1
나는 당신의 요점을 이해하지 못하는 것 같아요. 하지만 괜찮아.
alfadog67

답변:


86

JSON 표준은 큰 따옴표를 필요로하며, 작은 따옴표를 허용하지 않습니다 않으며 파서는 것이다.

문자열에 이스케이프 된 작은 따옴표가없는 간단한 케이스가있는 경우 (일반적으로 불가능하지만 JSON이 아님) 간단 할 수 str.replace(/'/g, '"')있으며 유효한 JSON으로 끝나야합니다.


5
귀하의 답변은 데이터를 변경합니다. 좋은 대답은 데이터 구조 내부의 데이터가 아니라 구조를 변경하는 것입니다.
Timothy Gonzalez

3
@ssube, 전역 작은 따옴표를 큰 따옴표로 대체하는 것이 가장 먼저 떠오르는 방법이며 사전 값을 파괴 할 수 있기 때문에 미끄러운 방법입니다. 예가 'title': "Mama's Friend"될 것입니다 "title": "Mama"s Friend"물론 무효의 인! 나는 귀하의 답변에 대해 반대 투표를해야하지만 반대 투표에 반대합니다. 이 의견은 훨씬 더 가치가 있습니다.
Apostolos

31

나는 그것이 오래된 게시물이라는 것을 알고 있지만 이 목적으로 JSON5 를 사용할 수 있습니다 .

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

8
: 위의 솔루션은 같은 실패 때문에 Upvoted {'section': "24'"} 된다 : {"section": "24""} 및 구문 분석하지 않습니다.
snedkov

1
이것이 최고의 답변이어야합니다.
Sam R.

완벽한 솔루션. 줄 바꿈과 빈 공백이 포함 된 html의 스크립트 태그에서 JSON 문자열을 긁어 내려고했습니다. 내 하루를 구했습니다!
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 및 평가의 차이에 대한 자세한 내용은 참조 ) (JSON.parse 비교 평가


2
이 평가는이 경우에 악 아니라고 생각하더라도, JSON.parse 항상 빠른 : jsperf.com/json-parse-vs-eval/3
Arkanoid의

그것 (때문에 JSON.stringify에)에만 유효 JSON을 사용하는이 경우에는 적용되지 않습니다 당신이 링크 된 벤치 마크를 @Arkanoid
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>


7
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

이것은 나를 위해 문제를 해결했습니다.


1
이렇게하면 데이터도 수정됩니다. {'a':"A'A"}될 것입니다{"a":"A"A"}
GodSaveTheDoge에게

6

JSON에서는 키에 작은 따옴표를 사용할 수 없습니다. 큰 따옴표를 사용해야합니다.

유스 케이스의 경우 아마도 이것이 가장 쉬운 솔루션이 될 것입니다.

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

출처 :

속성에 따옴표가 필요한 경우 큰 따옴표를 사용해야합니다. 모든 속성 이름은 큰 따옴표로 묶어야합니다.


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

귀하의 답변을 설명해주십시오
Sterling Archer

3
여러분, 절대 이러지 마세요. 이것은 매우 안전하지 않습니다
jpumford

Functioneval 대신 사용 하는 원칙 은 건전하지만 다른 모든 것은 잘못되었습니다. 그것은해야한다var json = Function("'use strict';return " + jsonString)()
잭 Giffin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.