78 lines
1.6 KiB
TypeScript
78 lines
1.6 KiB
TypeScript
|
|
/**
|
||
|
|
* JSON 字段解析工具
|
||
|
|
*
|
||
|
|
* 用于安全解析数据库中存储的 JSON 字符串
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 解析 JSON 字段
|
||
|
|
*
|
||
|
|
* @param value - 数据库中的 JSON 字符串
|
||
|
|
* @param defaultValue - 解析失败时的默认值
|
||
|
|
* @returns 解析后的对象或默认值
|
||
|
|
*
|
||
|
|
* @example
|
||
|
|
* ```typescript
|
||
|
|
* const tags = parseJsonField(course.gradeTags, []);
|
||
|
|
* const settings = parseJsonField(user.settings, {});
|
||
|
|
* ```
|
||
|
|
*/
|
||
|
|
export function parseJsonField<T>(
|
||
|
|
value: string | null | undefined,
|
||
|
|
defaultValue: T,
|
||
|
|
): T {
|
||
|
|
if (!value) {
|
||
|
|
return defaultValue;
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
return JSON.parse(value) as T;
|
||
|
|
} catch {
|
||
|
|
return defaultValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 安全地将对象转换为 JSON 字符串
|
||
|
|
*
|
||
|
|
* @param value - 要转换的对象
|
||
|
|
* @param defaultValue - 转换失败时的默认值
|
||
|
|
* @returns JSON 字符串或默认值
|
||
|
|
*/
|
||
|
|
export function stringifyJsonField(
|
||
|
|
value: any,
|
||
|
|
defaultValue: string = '{}',
|
||
|
|
): string {
|
||
|
|
if (value === null || value === undefined) {
|
||
|
|
return defaultValue;
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
return JSON.stringify(value);
|
||
|
|
} catch {
|
||
|
|
return defaultValue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 解析 JSON 数组字段
|
||
|
|
*
|
||
|
|
* @param value - 数据库中的 JSON 数组字符串
|
||
|
|
* @returns 解析后的数组或空数组
|
||
|
|
*/
|
||
|
|
export function parseJsonArray<T>(value: string | null | undefined): T[] {
|
||
|
|
return parseJsonField<T[]>(value, []);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 解析 JSON 对象字段
|
||
|
|
*
|
||
|
|
* @param value - 数据库中的 JSON 对象字符串
|
||
|
|
* @returns 解析后的对象或空对象
|
||
|
|
*/
|
||
|
|
export function parseJsonObject<T extends Record<string, any>>(
|
||
|
|
value: string | null | undefined,
|
||
|
|
): T {
|
||
|
|
return parseJsonField<T>(value, {} as T);
|
||
|
|
}
|