안전하게 JSON 문자열을 객체로 바꾸기


1334

JSON 데이터 문자열이 주어지면 어떻게 해당 문자열을 JavaScript 객체로 안전하게 바꿀 수 있습니까?

분명히 나는 ​​다음과 같이 안전하지 않게 이것을 할 수 있습니다 :

var obj = eval("(" + json + ')');

그러나 그것은 다른 코드를 포함하는 JSON 문자열에 취약하게 만듭니다. 단순히 평가하는 것은 매우 위험합니다.


77
대부분의 언어에서 평가는 추가 위험을 수반합니다. Eval은 해커가 악용 할 수있는 열린 문을 남깁니다. 그러나 모든 자바 스크립트는 클라이언트에서 실행됩니다. 기대하는 이 해커에 의해 변경됩니다. 콘솔을 사용하여 원하는 것을 평가할 수 있습니다. 서버 측에서 보호를 구축해야합니다.
Beachhouse 2012

19
자, 이제는 2014 년이며 eval코드를 "코드 삽입"에 노출 시키므로 JSON 문자열을 구문 분석하기 위해 사용해서는 안됩니다 . JSON.parse(yourString)대신 사용하십시오 .
Daniel

JSON 데이터는 리터럴입니까?
shanechiu

@shanechiu : 스칼라 데이터 타입을 의미한다면, 그렇습니다. 키-값 구문이 포함 된 문자열 일뿐입니다.
0zkr PM

답변:


1960

JSON.parse(jsonString) 최신 브라우저를 보장 할 수있는 한 순수한 JavaScript 방식입니다.


74
Node.js가 안전하다고 확신합니다
Stephen

76
@vsync이는 것을 실감 할 "... 당신은 당신이 볼 자바 스크립트 태그에 대한 설명을 읽으면 순수 자바 스크립트 응답을 ... 프레임 워크 / 라이브러리에 대한 태그도 포함되지 않는 한, 순수 자바 스크립트 대답은 . 예상 ".. 나는이에게주는 일을 ... 유일한 자바 스크립트 답을 되
iConnor


12
NodeJS를 수행하는 경우 jsonString을 JSON 객체로 구문 분석하기 위해 jQuery를로드 할 방법이 없습니다. 따라서 Jonathan의 답변을 찬성하십시오
Antony

6
이 링크 에 따르면 IE8 +에서 지원되지만 다음과 같이 표시됩니다.Requires document to be in IE8+ standards mode to work in IE8.
JoshuaDavid

878

jQuery 메소드는 더 이상 사용되지 않습니다. 대신이 방법을 사용하십시오.

let jsonObject = JSON.parse(jsonString);

더 이상 사용되지 않는 jQuery 기능을 사용한 원래 답변 :

jQuery를 사용하는 경우 다음을 사용하십시오.

jQuery.parseJSON( jsonString );

정확히 당신이 찾고있는 것입니다 (jQuery documentation 참조 ).


7
JSON.parse ()보다 이것을 사용해야하는 이유가 있습니까?
Jon

8
jQuery.parseJSONJSON.parse존재 하는 경우 기본값을 사용 하므로 실제 값보다 이것을 사용하는 유일한 이유는 <IE7에 대한 대체가 필요하기 때문입니다. jQuery 1.6에서 다시 변경되었습니다 : james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON
Karl-Johan Sjögren

9
2016 업데이트 : jQuery 3.0부터 $ .parseJSON 은 더 이상 사용되지 않으며 대신 기본 JSON.parse 메소드를 사용해야합니다.
jkdev

159

이 답변은 IE <7에 대한 것이며 최신 브라우저의 경우 위의 Jonathan의 답변을 확인하십시오.

이 답변은 구식이며 위의 Jonathan의 답변 ( JSON.parse(jsonString))이 이제 가장 좋습니다 .

JSON.org 에는 JavaScript에 대한 네 가지 언어를 포함하여 여러 언어에 대한 JSON 파서가 있습니다. 나는 대부분의 사람들이 json2.js를 그들의 goto 구현으로 간주한다고 생각 합니다.


24
사람들이이 답변에 대한 투표를 중단하기를 바랍니다. 2008 년에 게시 된 날짜는 정확했습니다. 새 항목을 공표하십시오.
John

22
답변이 구식 인 경우 업데이트를 고려하십시오.
Sotirios Delimanolis

2
IE <8의 경우 이것을 사용해야합니다.
Mahmoodvcs

74

" JSON.parse () " 의 간단한 코드 예제를 사용하십시오 .

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

그리고 반전 :

var str = JSON.stringify(arr);

23

다른 방법에 대해서는 잘 모르겠지만 프로토 타입 (JSON 튜토리얼) 에서 수행하는 방법은 다음과 같습니다 .

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

evalJSON()인수로 true를 호출 하면 수신 문자열이 삭제됩니다.


22

이것은 문제인 것 같습니다.

Ajax websocket 등을 통해 수신 된 입력은 문자열 형식이지만 입력 여부는 알아야합니다 JSON.parsable. 문제는 항상 프로그램을 통해 실행 JSON.parse하면 프로그램이 "성공적으로"계속 될 수 있지만 여전히 콘솔에 dreaded 오류가 표시되는 것 "Error: unexpected token 'x'"입니다.

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

아니. 문제는 JSON 객체를 예상하고 (function(){ postCookiesToHostileServer(); }());노드 와 관련하여 결국 더 나빠질 수 있다는 것입니다.
Yaur

JSON.parse는 함수 입력을 제거합니다 (이 경우 IIF-> 객체로 도움이되지 않음). 이 주제를 다루는 가장 좋은 방법은 try / catch입니다. (편집 참조)
Cody

18

jQuery를 사용하는 경우 다음 을 사용할 수도 있습니다.

$.getJSON(url, function(data) { });

그럼 당신은 같은 일을 할 수 있습니다

data.key1.something
data.key1.something_else

기타


jQuery를 사용하고 있습니까?
Alexandre C.

15
$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

콜백은 반환 된 데이터를 전달합니다.이 데이터는 JSON 구조로 정의되고 $.parseJSON()메소드를 사용하여 구문 분석 된 JavaScript 오브젝트 또는 배열 입니다.


12

재미를 위해 다음은 함수를 사용하는 방법입니다.

 jsonObject = (new Function('return ' + jsonFormatData))()

1
재미있는 접근법, JSON과 함께 이것을 사용할지 잘 모르겠습니다. 구문을 사용할 수 있지만 상자 밖에서 생각하는 사람을 보는 것이 좋습니다.

5
이것은 단순히 사용 eval하는 것과 매우 유사하며 안전하지 않습니다. : P
Florrie 2011

7
이것은 사용의 모든 단점이 eval있지만 관리자가 이해하기가 더 복잡하고 어렵습니다.
Quentin

9

사용은 JSON.parse아마도 가장 좋은 방법입니다.

다음은 라이브 데모 의 예 입니다.

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

9

방법을 사용하는 가장 쉬운 parse()방법 :

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

그런 다음 JSON 요소의 값을 얻을 수 있습니다 (예 :

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

설명서에 설명 된대로 jQuery 사용 jQuery.parseJSON():

JSON.parse(jsonString);

9

이 Data 객체에 메서드를 사용해보십시오. 예 : Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

이 방법은 Nodejs에서 실제로 도움이됩니다. 은 직렬 포트 프로그래밍 작업을


사람들이 어떻게 "eval is evil"에 고정되어 있는지는 매우 재밌으며, 전체 eval 기능을 다시 작성하는 것조차 피하기 위해 무엇이든 할 것입니다 ..
diynevala

이 트릭은 문자열을 JSON 객체로 바꾸는 안전한 방법입니까? 추가 js 가져 오기가 필요하지 않으므로 이것을 사용할 수 있습니다.
Whome

1
모든 사용 방법 eval또는 Function동등 취약
Slai

undefined; function bye() {...} bye();
Salvioner

5

"더 나은"방법을 찾았습니다.

CoffeeScript에서 :

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

자바 스크립트에서 :

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

4

JSON 파싱은 항상 고통입니다. 입력이 예상과 다르면 오류가 발생하고 수행중인 작업이 충돌합니다.

다음과 같은 작은 기능을 사용하여 입력을 안전하게 구문 분석 할 수 있습니다. 입력이 유효하지 않거나 대부분의 경우에 더 나은 객체 인 경우에도 항상 객체를 전환합니다.

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

Object.prototype.toString.call(input) === '[object Object]'typeof input === 'object'IMO 여야 함
Serge K.

typeof 입력은 null 및 배열에 대한 객체도 반환합니다. 따라서이 작업을 수행하는 안전한 방법은 아닙니다.
Tahsin Turkoz

이미 null사례를 다루었으며 배열 객체입니다. 테스트하려면을 사용할 수 있습니다 instanceof. 이 기능를 제공하는 경우 또한 Array, 그것은 잡을 것이다 return def는 완벽하게 잘 배열을 돌아왔다 수있을 때.
S. K.

내 의견은 물건을 잡는 동안 상식에 관한 것이었다. 내 기능에는 여러 가지 예방 기능이 있지만 입력 유형을 사용하는 것이 일반적으로 객체를 감지하는 데 선호되는 방법은 아닙니다.
Tahsin Turkoz

IMO, 상식은 toString()변수가 객체인지 여부를 확인 하는 방법을 사용 하지 않습니다. AngularJS , jQuery , Underscore 또는 심지어 개발자를
Serge K.


3

다음과 같은 문자열이 있다면 :

"{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"

그런 다음 JSON.parse이 문자열을 JSON 객체로 변환하기 위해 두 번 사용할 수 있습니다 .

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

다음을 사용하여 JSON 객체에서 값을 추출 할 수 있습니다.

// instead of last JSON.parse:
var { status, token } = JSON.parse(jsonString);

결과는 다음과 같습니다.

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

3

JSON.parse() 함수에 전달 된 모든 JSON 문자열을 JSON 객체로 변환합니다.

더 잘 이해하려면을 눌러 F12브라우저에서 "요소 검사"를 열고 콘솔로 이동하여 다음 명령을 작성하십시오.

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

이제 다음 명령을 실행하십시오 :

console.log(JSON.parse(response));

Object로 출력됩니다 {result: true, count: 1}.

해당 객체를 사용하기 위해 다음과 같은 변수에 객체를 할당 할 수 있습니다 obj.

var obj = JSON.parse(response);

사용하여 obj도트 ( .) 연산자는 JSON 객체의 속성에 액세스 할 수 있습니다.

다음 명령을 실행하십시오 :

console.log(obj.result);

3

공식 문서 :

JSON.parse()메소드는 JSON 문자열을 구문 분석하여 문자열로 설명되는 JavaScript 값 또는 오브젝트를 구성합니다. reviver결과 객체를 반환하기 전에 변환을 수행하기위한 선택적 함수를 제공 할 수 있습니다.

통사론:

JSON.parse(text[, reviver])

매개 변수 :

text : JSON으로 구문 분석 할 문자열입니다. JSON 구문에 대한 설명은 JSON 객체를 참조하십시오.

reviver (optional) : 함수 인 경우 파싱에 의해 원래 생성 된 값이 반환되기 전에 어떻게 변환되는지를 규정합니다.

반환 값

주어진 JSON 텍스트에 해당하는 Object입니다.

예외

구문 분석 할 문자열이 유효한 JSON이 아닌 경우 SyntaxError 예외가 발생합니다.



2

로 JSON 문자열을 구문 분석하면 JSON.parse()데이터가 JavaScript 객체가됩니다.

JSON.parse(jsonString)

여기서 JSON은 JSON 데이터 세트를 처리하는 것을 나타냅니다.

웹 서버에서이 텍스트를 받았다고 상상해보십시오.

'{ "name":"John", "age":30, "city":"New York"}'

JSON 객체로 구문 분석하려면 다음을 수행하십시오.

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

다음 obj은 각각의 JSON 객체입니다.

{ "name":"John", "age":30, "city":"New York"}

값을 가져 오려면 .연산자를 사용하십시오 .

obj.name // John
obj.age //30

로 JavaScript 객체를 문자열로 변환합니다 JSON.stringify().


1

다른 입력 유형에 대한 표지 구문 분석

JSON.parse ()로 데이터를 구문 분석하면 데이터가 JavaScript 객체가됩니다.

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');

배열에서 파생 된 JSON에서 JSON.parse ()를 사용하면이 메서드는 JavaScript 객체 대신 JavaScript 배열을 반환합니다.

var myArr = JSON.parse(this.responseText);
console.log(myArr[0]);

날짜 객체는 JSON에서 허용되지 않습니다. Dates는 이와 같은 일을합니다.

var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text);
obj.birth = new Date(obj.birth);

JSON에서는 함수를 사용할 수 없습니다. 함수를 포함해야 할 경우 문자열로 작성하십시오.

var text = '{ "name":"John", "age":"function () {return 30;}", "city":"New York"}';
var obj = JSON.parse(text);
obj.age = eval("(" + obj.age + ")");

0

오래된 질문이지만, 아무도 new Function()데이터를 반환하는 익명 함수를 사용 하여이 솔루션을 알지 못합니다 .


예를 들면 :

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

이것은 함수 내에서 실행되며 코드에서 직접 컴파일하지 않기 때문에 조금 더 안전합니다. 따라서 내부에 함수 선언이 있으면 기본 창 객체에 바인딩되지 않습니다.

나는 이것을 사용하여 DOM 요소 (예 : data 속성)의 구성 설정을 간단하고 빠르게 '컴파일'합니다.


0

요약:

Javascript (브라우저 및 NodeJS)에는 내장 JSON객체가 있습니다. 이 Object에는을 다루는 두 가지 편리한 방법이 JSON있습니다. 그들은 다음과 같습니다.

  1. JSON.parse() 소요 JSON , 인수로 JS 객체를 반환
  2. JSON.stringify() 인수를 반환하는 JSON객체 로 JS 객체를 사용 합니다.

다른 응용 프로그램 :

매우 편리하게 다루는 것 외에도 JSON다른 수단으로 사용할 수 있습니다. 두 JSON방법을 조합 하면 배열이나 객체를 깊게 복제 할 수 있습니다. 예를 들면 다음과 같습니다.

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged


0

reviver기능을 사용 하여 필터링 할 수도 있습니다 .

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

자세한 내용은를 참조하십시오 JSON.parse.


0

JSON.parse는 문자열을 객체로 변환하는 올바른 방법이지만 구문 분석 된 문자열이 객체가 아니거나 문자열이 올바르지 않으면 오류가 발생하여 코드의 나머지 부분이 중단됩니다. try-catch 안에 JSON.parse 함수를 래핑하는 데 이상적입니다.

try{
   let obj = JSON.parse(string);
}catch(err){
   console.log(err);
}

-1

이것을 시도하십시오. 이것은 타자기로 작성되었습니다.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }

Typescript를 처음 사용합니다. 이로 인해 어떤 이점이 JSON.parse()있습니까?
Marc L.

예외가 발생하면 입력 문자열 자체를 반환합니다
Supun Dharmarathne

-1
/**
 * Safely turning a JSON string into an object
 *
 * @param {String} str - JSON String
 * @returns deserialized object, false if error
 */
export function jsonParse(str) {
  let data = null;
  try {
    data = JSON.parse(str);
  } catch (err) {
    return false;
  }
  return data;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.