diff --git a/docs/docs/utils/common/parseJson.md b/docs/docs/utils/common/parseJson.md new file mode 100644 index 000000000..32ba42ce1 --- /dev/null +++ b/docs/docs/utils/common/parseJson.md @@ -0,0 +1,23 @@ +# parseJson + +일반적으로 JSON.parse를 사용하는 경우 일부 input값(ex. 빈 문자열, undefined, NaN)에 대해서는 에러를 반환합니다. 이 함수를 사용하면 에러를 반환하는 값에 대해서는 null을 반환하여 파싱 시의 예상치 못한 에러를 방지할 수 있습니다. + +
+ +## Interface +```tsx +const parseJson: (value: any) => T | null +``` + +## Usage +```ts +import { parseJson } from '@modern-kit/utils'; + +type NormalObject = { a: 1, b: 2 } + +const normalObject = parseJSON(`{ "a": 1, "b": 2 }`); // { a: 1, b: 2 } | null +const emptyString = parseJSON<''>(''); // '' | null +const nullValue = parseJSON(null); // null +const undefinedValue = parseJSON(undefined); // undefined | null +const NaNValue = parseJSON(NaN); // number | null +``` \ No newline at end of file diff --git a/packages/utils/src/common/parseJson/index.ts b/packages/utils/src/common/parseJson/index.ts new file mode 100644 index 000000000..54306d6e4 --- /dev/null +++ b/packages/utils/src/common/parseJson/index.ts @@ -0,0 +1,16 @@ +export const parseJSON = (value: any): T | null => { + if (typeof value !== 'string') { + return value as T; + } + + if (value === '') { + return '' as T; + } + + try { + return JSON.parse(value) as T; + } catch { + console.error(`데이터를 파싱하는 데에 실패했습니다. 원본: ${value}`); + return null; + } +}; diff --git a/packages/utils/src/common/parseJson/parseJson.spec.ts b/packages/utils/src/common/parseJson/parseJson.spec.ts new file mode 100644 index 000000000..631f971a0 --- /dev/null +++ b/packages/utils/src/common/parseJson/parseJson.spec.ts @@ -0,0 +1,62 @@ +import { parseJSON } from '.'; + +type Test1 = { a: 1; b: 2 }; +type Test2 = { + a: 1; + b: [2, 3, { c: 4 }]; + d: { e: 5; f: 6 }; +}; +type Test3 = ['foo', { bar: 'baz' }]; + +describe('parseJSON', () => { + it('should return original value for falsy value', () => { + const falseValue = parseJSON(false); + const zeroNumberValue = parseJSON<0>(0); + const emptyStringValue = parseJSON<''>(''); + const nullValue = parseJSON(null); + const undefinedValue = parseJSON(undefined); + const NaNValue = parseJSON(NaN); + + expect(falseValue).toBe(false); + expect(zeroNumberValue).toBe(0); + expect(emptyStringValue).toBe(''); + expect(nullValue).toBeNull(); + expect(undefinedValue).toBeUndefined(); + expect(NaNValue).toBeNaN(); + }); + + it('should correctly parse stringified value', () => { + const result = parseJSON(`{ "a": 1, "b": 2 }`); + + expect(result).toEqual({ a: 1, b: 2 }); + }); + + it('should correctly parse complex JSON objects', () => { + const complexJson = `{ + "a": 1, + "b": [2, 3, {"c": 4}], + "d": {"e": 5, "f": 6} + }`; + const result = parseJSON(complexJson); + + expect(result).toEqual({ + a: 1, + b: [2, 3, { c: 4 }], + d: { e: 5, f: 6 }, + }); + }); + + it('should correctly parse JSON arrays', () => { + const jsonArray = `["foo", {"bar": "baz"}]`; + const result = parseJSON(jsonArray); + + expect(result).toEqual(['foo', { bar: 'baz' }]); + }); + + it('should return null for incorrect JSON format', () => { + const incorrectJson = `{a: 1, b: 2}`; + const result = parseJSON(incorrectJson); + + expect(result).toBeNull(); + }); +});