diff --git a/README.md b/README.md index fb56700..922fcb4 100644 --- a/README.md +++ b/README.md @@ -105,3 +105,10 @@ npm run preview - 日期字段会尽量兼容 Excel 序列日期(数字日期) - 当 `excludeIfEmpty = true` 时,空值字段不会出现在输出 JSON 中 - 若目标字段包含 `.`,会按路径写入嵌套对象 + +## ͼ + +![ͼ 1](doc/images/image1.png) + +![ͼ 2](doc/images/image2.png) + diff --git a/doc/images/image1.png b/doc/images/image1.png new file mode 100644 index 0000000..2678a30 Binary files /dev/null and b/doc/images/image1.png differ diff --git a/doc/images/image2.png b/doc/images/image2.png new file mode 100644 index 0000000..a4f6419 Binary files /dev/null and b/doc/images/image2.png differ diff --git a/src/lib/components/JsonPreview.svelte b/src/lib/components/JsonPreview.svelte index fd2e198..1ebff8d 100644 --- a/src/lib/components/JsonPreview.svelte +++ b/src/lib/components/JsonPreview.svelte @@ -1,4 +1,6 @@
+

- JSON 预览 - {json.length} 条记录 + JSON + {json.length} 条

-
- {#if editing} +
+ {#if viewMode === 'edit'} @@ -85,7 +93,24 @@ 取消 {:else} - + +
+ {/if} @@ -96,21 +121,30 @@
{parseError}
{/if} +
- {#if editing} - + {#if viewMode === 'edit'} + {:else if viewMode === 'tree'} +
+ + {#if treeTruncated} +
+ ⚠️ 树形视图仅展示前 {MAX_TREE_ITEMS} 条记录(共 {json.length.toLocaleString()} 条)。请下载或复制查看完整数据。 +
+ {/if} +
{:else}
{@html highlight(truncated.text)}
{#if truncated.isTruncated} -
- ⚠️ 预览已截断以提升性能(显示 {Math.min(MAX_PREVIEW_CHARS, truncated.text.length).toLocaleString()}/{truncated.totalChars.toLocaleString()} 字符,{Math.min(MAX_PREVIEW_LINES, truncated.totalLines)}/{truncated.totalLines.toLocaleString()} 行)。请点击下载或复制查看完整数据。 +
+ ⚠️ 预览已截断(显示 {Math.min(MAX_PREVIEW_CHARS, truncated.text.length).toLocaleString()}/{truncated.totalChars.toLocaleString()} 字符,{Math.min(MAX_PREVIEW_LINES, truncated.totalLines)}/{truncated.totalLines.toLocaleString()} 行)。请下载或复制查看完整数据。
{/if}
diff --git a/src/lib/components/JsonTreeNode.svelte b/src/lib/components/JsonTreeNode.svelte new file mode 100644 index 0000000..879a8c6 --- /dev/null +++ b/src/lib/components/JsonTreeNode.svelte @@ -0,0 +1,98 @@ + + +
+
+ {#if isExpandable} + + {:else} + + {/if} + + {#if keyName !== undefined} + + {typeof keyName === 'number' ? keyName : `"${keyName}"`} + {/if} + + {#if isExpandable} + + {:else if valueType === 'string'} + "{String(value)}" + {:else if valueType === 'number'} + {String(value)} + {:else if valueType === 'boolean'} + {String(value)} + {:else if valueType === 'null'} + null + {:else} + {String(value)} + {/if} +
+ + {#if isExpandable && open} +
+ {#each entries as [childKey, childVal], i (childKey)} + + {/each} +
+
+ {valueType === 'array' ? ']' : '}'} +
+ {/if} +