更新记录
1.0.0(2025-08-13)
完整测试各平台
平台兼容性
云端兼容性
阿里云 | 腾讯云 | 支付宝云 |
---|---|---|
√ | √ | √ |
uni-app(4.72)
Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
---|---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - | - |
微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
---|---|---|---|---|---|---|---|---|---|---|
- | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.74)
Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ |
JsonDisplay 组件说明文档
组件概述
JsonDisplay 是一个用于展示 JSON 数据结构的递归组件,核心功能是将 JSON 数据以树形结构可视化展示,支持节点的展开与折叠操作,并通过颜色区分不同的数据类型。该组件基于 Vue 3 语法实现,采用单文件组件 (SFC) 形式开发,可直接集成到 Vue 或 uni-app 项目中。
核心功能
- JSON 结构可视化:将 JSON 数据(对象、数组及基本类型)以层级结构展示
- 展开/折叠交互:支持点击按钮展开或折叠对象/数组类型的节点
- 类型区分显示:通过不同颜色标识不同的数据类型(对象、数组、字符串等)
- 递归渲染:通过组件递归调用实现任意层级的 JSON 数据展示
- 自动缩进:根据节点层级自动计算缩进量,清晰展示层级关系
组件Props
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
data | any | - | 必传,当前节点要展示的数据 |
keyName | string | '' | 可选,当前节点的键名(对象节点使用) |
index | number | -1 | 可选,当前节点的索引(数组节点使用) |
level | number | - | 必传,当前节点的层级,用于计算缩进 |
indentSize | number | - | 必传,每层缩进的像素值 |
collapsible | boolean | - | 必传,是否允许节点展开/折叠 |
defaultExpanded | boolean | - | 必传,节点默认是否展开 |
isRoot | boolean | false | 可选,是否为根节点 |
isArrayItem | boolean | false | 可选,是否为数组项 |
isLastChild | boolean | false | 可选,是否为父节点的最后一个子节点 |
数据类型支持
组件支持以下 JSON 数据类型的展示,并为每种类型提供独特的颜色标识:
数据类型 | 标识颜色 | 显示格式 |
---|---|---|
对象 (Object) | 绿色 (#10b981) | 折叠时显示 { ... } |
数组 (Array) | 绿色 (#10b981) | 折叠时显示 [ X items ] (X为数组长度) |
字符串 (String) | 蓝色 (#3b82f6) | 带双引号包裹 |
数字 (Number) | 橙色 (#f59e0b) | 直接显示数值 |
布尔值 (Boolean) | 红色 (#ef4444) | 显示 true 或 false |
Null | 灰色 (#64748b) | 显示 null |
日期 (Date) | 橙色 (#f97316) | 显示 ISO 格式字符串 |
组件结构
组件采用递归结构设计,主要包含以下部分:
- 节点行:展示当前节点的键名/索引和值(或起始括号)
- 展开/折叠按钮:仅容器类型节点显示,用于控制子节点的显示/隐藏
- 子节点容器:当节点展开时,递归渲染所有子节点
- 闭合括号:与起始括号配对,位于子节点下方,保持结构完整性
- 逗号分隔符:用于分隔同级节点,最后一个节点不显示逗号
样式说明
组件通过 scoped CSS 实现样式隔离,主要样式类包括:
.parent-container
:节点的最外层容器.toggle-container
:展开/折叠按钮的容器.toggle-btn
:展开/折叠按钮(显示 "+" 或 "-").node-content
:节点内容容器(包含键名、分隔符和值).children-container
:子节点容器,用于递归渲染子节点.closing-bracket
:闭合括号容器.comma-line
:逗号分隔符容器
使用方法
由于该组件为递归组件,通常需要一个父组件来初始化根节点,示例如下:
<template>
<view class="json-viewer">
<JsonDisplay
:data="jsonData"
:level="0"
:indentSize="24"
:collapsible="true"
:defaultExpanded="true"
:isRoot="true"
/>
</view>
</template>
<script setup>
import JsonDisplay from './JsonDisplay.uvue';
// 示例数据
const jsonData = {
name: "测试数据",
version: 1.0,
features: ["展开", "折叠", "类型显示"],
settings: {
enabled: true,
timeout: null
}
};
</script>
注意事项
- 组件依赖 Vue 3 的组合式 API(
<script setup>
) - 处理包含循环引用的 JSON 数据会导致递归溢出,需提前处理
- 过长的字符串会被截断(默认最大长度 50)并添加 "..." 后缀
- 键名和字符串值中的双引号会被转义为
\"
- 组件样式中包含平台特定代码(通过条件编译
#ifdef
实现),主要适配 H5 和 APP-WEBVIEW
已知限制
- 不支持循环引用的 JSON 结构
- 不支持自定义数据类型的颜色
- 不支持编辑 JSON 数据,仅用于展示
- 超大 JSON 数据(超过 1000 个节点)可能导致性能问题
联系作者
- M:*** - VX:haijian_guo
该组件专注于 JSON 数据的结构化展示,代码简洁高效,适合在调试工具、数据可视化等场景中使用。