Skip to content

Commit

Permalink
feat(utils): parseJson 함수 추가 완료 (#115)
Browse files Browse the repository at this point in the history
* feat(utils): parseJson 함수 추가 완료

* imp(utils): parseJson의 입력값이 빈 문자열인 경우에도 그대로 반환하도록 수정 및 일부 타입 보강 완료

* imp(utils): parseJson함수 내 조건식 위치 변경 및 환경변수 체크구문 제거 완료

* docs(utils): parseJson함수 문서 타입 반환값 수정 완료
  • Loading branch information
Sangminnn authored May 11, 2024
1 parent bf9bcc2 commit 2e1b50e
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 0 deletions.
23 changes: 23 additions & 0 deletions docs/docs/utils/common/parseJson.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# parseJson

일반적으로 JSON.parse를 사용하는 경우 일부 input값(ex. 빈 문자열, undefined, NaN)에 대해서는 에러를 반환합니다. 이 함수를 사용하면 에러를 반환하는 값에 대해서는 null을 반환하여 파싱 시의 예상치 못한 에러를 방지할 수 있습니다.

<br />

## Interface
```tsx
const parseJson: <T>(value: any) => T | null
```
## Usage
```ts
import { parseJson } from '@modern-kit/utils';

type NormalObject = { a: 1, b: 2 }

const normalObject = parseJSON<NormalObject>(`{ "a": 1, "b": 2 }`); // { a: 1, b: 2 } | null
const emptyString = parseJSON<''>(''); // '' | null
const nullValue = parseJSON<null>(null); // null
const undefinedValue = parseJSON<undefined>(undefined); // undefined | null
const NaNValue = parseJSON<typeof NaN>(NaN); // number | null
```
16 changes: 16 additions & 0 deletions packages/utils/src/common/parseJson/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
export const parseJSON = <T>(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;
}
};
62 changes: 62 additions & 0 deletions packages/utils/src/common/parseJson/parseJson.spec.ts
Original file line number Diff line number Diff line change
@@ -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>(false);
const zeroNumberValue = parseJSON<0>(0);
const emptyStringValue = parseJSON<''>('');
const nullValue = parseJSON<null>(null);
const undefinedValue = parseJSON<undefined>(undefined);
const NaNValue = parseJSON<typeof NaN>(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<Test1>(`{ "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<Test2>(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<Test3>(jsonArray);

expect(result).toEqual(['foo', { bar: 'baz' }]);
});

it('should return null for incorrect JSON format', () => {
const incorrectJson = `{a: 1, b: 2}`;
const result = parseJSON<null>(incorrectJson);

expect(result).toBeNull();
});
});

0 comments on commit 2e1b50e

Please sign in to comment.