kakasoo

함수가 포함된 JSON을 parse하는 방법 본문

프로그래밍/JavaScript

함수가 포함된 JSON을 parse하는 방법

카카수(kakasoo) 2023. 2. 4. 23:01
반응형

어떤 객체를 문자열로 변환한 것에 함수가 포함되어 있는 경우 JSON.parse는 사용할 수 없다.

이런 경우, 안타깝게도 정상적인 방법은 없다.

다만, 그나마 가능성이 있는 것이 바로 정규표현식으로, 아래와 같이 작성해볼 수 있다.

 

const regex = /(?<=:)\s*(async\s+)?(function\(.*\)\s*\{[\s\S]+?\}|\(.*\)\s*=>\s*\{[\s\S]+?\})\s*(?=,|})*/g;

async가 있을 수도 없을 수도 있는 function 혹은 화살표 함수에 대한 정규 표현식으로, 이걸 사용해 함수 부분을 캐치한다.

그 후 String.prototype.replaceAll 로 함수 부분을 쓸 모 없는 아무 값으로 변환하는 것이다.

하지만 그나마 가능성 있다는 말처럼, 나는 이런 정규 표현식을 사용하여 문제를 해결하는 데에는 실패했다.

왜냐하면 내가 마주한 문제는 \r\n과 같이 줄바꿈이나 각종 엔티티 문자, 심지어 함수 부분에 주석까지 달려 있는 문자열이었기 때문이다.
그런 부분까지 모두 정리해서 정규 표현식으로 작성한다는 것은 사실 상 불가능에 가깝지 않나 싶다.

그래서 비정상적인 방법 하나를 제안한다.

 

const someObjString = '{ a:3, b: function () { console.log("hi"); } }';
const someObj = eval(`() => (${someObjString})`)();

함수가 있을 경우, 그 함수를 포함한 객체 자체를 반환하는 함수가 되게끔 문자열의 앞에 '() =>'를 추가해준 다음 eval에 넣는다.

해당 객체 내의 함수가 무엇인지도 모르고, 즉시 실행되는 어떠한 종류의 코드가 있을 경우 심히 위험할 수도 있다.

하지만 온전히 객체라는 전제 하에, 이런 un-safe한 방법으로 JSON.parse와 동일한 기능을 수행할 수 있다.

반응형