jsonBig.ts 1.1 KB

12345678910111213141516171819202122232425262728
  1. // 简单安全的 JSON 解析器,可在解析前把 Snowflake 类的长整数字段(如 id、userId、patientUserId、boundUserId、relatedEntityId)
  2. // 转换为字符串(通过在值外包裹引号)以避免 JS Number 导致的精度丢失。
  3. // 注意:这是一个保守实现,仅针对常见字段名做文本替换;如果你需要更强健的解决方案,考虑使用 json-bigint 等专用库。
  4. const jsonbig = JSON
  5. export function safeJsonParse(raw: string | object | undefined | null) {
  6. if (typeof raw === 'string') {
  7. try {
  8. // 将长整数字段包装为字符串,避免 JSON.parse 将其转换为 Number 并引发精度丢失。
  9. // 匹配示例: "userId":1988147181088956418 -> "userId":"1988147181088956418"
  10. const preprocessed = raw.replace(/"(id|userId|patientUserId|boundUserId|relatedEntityId)"\s*:\s*([0-9]{10,})/g, '"$1":"$2"')
  11. return jsonbig.parse(preprocessed)
  12. } catch (err) {
  13. return raw
  14. }
  15. }
  16. return raw
  17. }
  18. export function safeJsonStringify(v: any) {
  19. try {
  20. return jsonbig.stringify(v)
  21. } catch (e) {
  22. return JSON.stringify(v)
  23. }
  24. }
  25. export default jsonbig