From fa7c89cb44452de2b7e4d8072f9e8bccec4df16b Mon Sep 17 00:00:00 2001 From: zxfishhack Date: Tue, 25 Mar 2025 15:17:57 +0800 Subject: [PATCH] add unescape unicode in JSON Prettify --- components.d.ts | 5 +++++ src/tools/json-viewer/json-viewer.vue | 6 +++++- src/tools/json-viewer/json.models.ts | 11 ++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/components.d.ts b/components.d.ts index 3e65c3cc..ef0d74d7 100644 --- a/components.d.ts +++ b/components.d.ts @@ -131,17 +131,22 @@ declare module '@vue/runtime-core' { MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default'] NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default'] NCheckbox: typeof import('naive-ui')['NCheckbox'] + NCode: typeof import('naive-ui')['NCode'] NCollapseTransition: typeof import('naive-ui')['NCollapseTransition'] NConfigProvider: typeof import('naive-ui')['NConfigProvider'] NDivider: typeof import('naive-ui')['NDivider'] NEllipsis: typeof import('naive-ui')['NEllipsis'] + NFormItem: typeof import('naive-ui')['NFormItem'] NH1: typeof import('naive-ui')['NH1'] NH3: typeof import('naive-ui')['NH3'] NIcon: typeof import('naive-ui')['NIcon'] + NInputNumber: typeof import('naive-ui')['NInputNumber'] NLayout: typeof import('naive-ui')['NLayout'] NLayoutSider: typeof import('naive-ui')['NLayoutSider'] NMenu: typeof import('naive-ui')['NMenu'] + NScrollbar: typeof import('naive-ui')['NScrollbar'] NSpace: typeof import('naive-ui')['NSpace'] + NSwitch: typeof import('naive-ui')['NSwitch'] NTable: typeof import('naive-ui')['NTable'] NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default'] OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default'] diff --git a/src/tools/json-viewer/json-viewer.vue b/src/tools/json-viewer/json-viewer.vue index 3928a44f..21c518e6 100644 --- a/src/tools/json-viewer/json-viewer.vue +++ b/src/tools/json-viewer/json-viewer.vue @@ -11,7 +11,8 @@ const inputElement = ref(); const rawJson = useStorage('json-prettify:raw-json', '{"hello": "world", "foo": "bar"}'); const indentSize = useStorage('json-prettify:indent-size', 3); const sortKeys = useStorage('json-prettify:sort-keys', true); -const cleanJson = computed(() => withDefaultOnError(() => formatJson({ rawJson, indentSize, sortKeys }), '')); +const unescapeUnicode = useStorage('json-prettify:unescape-unicode', false); +const cleanJson = computed(() => withDefaultOnError(() => formatJson({ rawJson, indentSize, sortKeys, unescapeUnicode }), '')); const rawJsonValidation = useValidation({ source: rawJson, @@ -30,6 +31,9 @@ const rawJsonValidation = useValidation({ + + + diff --git a/src/tools/json-viewer/json.models.ts b/src/tools/json-viewer/json.models.ts index 9bed3659..7998ac53 100644 --- a/src/tools/json-viewer/json.models.ts +++ b/src/tools/json-viewer/json.models.ts @@ -20,16 +20,25 @@ function sortObjectKeys(obj: T): T { }, {} as Record) as T; } +function unescapeUnicodeJSON(str: string) { + return str.replace(/\\u([\dA-Fa-f]{4})/g, (match, grp) => + String.fromCharCode(Number.parseInt(grp, 16)), + ); +} + function formatJson({ rawJson, sortKeys = true, indentSize = 3, + unescapeUnicode = false, }: { rawJson: MaybeRef sortKeys?: MaybeRef indentSize?: MaybeRef + unescapeUnicode?: MaybeRef }) { - const parsedObject = JSON5.parse(get(rawJson)); + const raw = get(rawJson); + const parsedObject = JSON5.parse(get(unescapeUnicode) ? unescapeUnicodeJSON(raw) : raw); return JSON.stringify(get(sortKeys) ? sortObjectKeys(parsedObject) : parsedObject, null, get(indentSize)); }