使用vue-json-viewer实现JSON数据可视化详解

 更新时间:2025年01月16日 09:42:57   作者:水星记_  
vue-json-viewer 是一个用于在 vue.js 应用中展示 JSON 数据的插件,它提供了一种直观和美观的方式来可视化 JSON 数据,下面我们来看看如何使用它进行JSON数据可视化吧

前言

接口的调试和测试是确保系统稳定性的重要步骤。为了让开发人员和测试人员能够直观地查看接口返回的 JSON 数据,使用合适的工具至关重要。vue-json-viewer 插件为 vue 开发者提供了一个简单而强大的解决方案。本文将详细介绍如何在 vue 项目中使用该插件,帮助你快速上手,提升接口测试的效率。

一、vue-json-viewer

vue-json-viewer 是一个用于在 vue.js 应用中展示 JSON 数据的插件。它提供了一种直观和美观的方式来可视化 JSON 数据,特别适合用于调试和展示 API 返回的数据。

为什么要选择 vue-json-viewer?

1.易于使用

插件的使用非常简单,只需安装并在 vue 组件中引入即可使用,适合快速集成到现有项目中。

2.美观的展示

vue-json-viewer 提供了友好的用户界面,能够以树形结构展示 JSON 数据,便于用户理解和查看数据层级。

3.支持复制功能

插件内置了复制功能,用户可以轻松复制 JSON 数据,方便进行调试或分享。

4.主题支持

插件支持自定义主题,开发者可以根据项目的设计风格调整 JSON 数据的展示样式。

5.预览模式

提供预览模式,可以在不展开所有数据的情况下,快速查看 JSON 数据的结构。

1.1 配置

属性描述默认值
valuejson对象的值,可以使用v-model,支持响应式必填
expand-depth默认展开的层级1
copyable展示复制按钮,默认文案为:copy、copied!, 你可以设置一个对象{copyText: ‘copy’, copiedText: ‘copied’} 来自定义复制按钮文案false
sort按照key排序展示false
boxed为组件添加一个盒样式false
theme添加一个自定义的样式class用作主题jv-light
expanded默认展开视图false
timeformat自定义时间格式函数time => time.toLocaleString()
preview-mode不可折叠模式,默认全部展开false
show-array-index是否显示数组索引true
show-double-quotes展示key双引号false

1.2 事件

事件描述
copied复制文本后的事件
keyclick点击key的事件

1.3 Slots

名称描述Scope
copy自定义拷贝按钮{copied: boolean}

1.4 快捷键

名称描述
alt + click展开当前节点下的所有节点

二、安装

可以通过 npm 或 yarn 安装 vue-json-viewer 插件。

npm install vue-json-viewer --save

yarn add vue-json-viewer

三、注册引入

3.1 全局注册组件

在全局 main.js 中引入并注册。

import JsonViewer from 'vue-json-viewer'
Vue.use(JsonViewer)

3.2 单个组件引入

import JsonViewer from 'vue-json-viewer'
export default {
    components:{ JsonViewer }
}

四、基础使用

<template>
  <div>
    <json-viewer :value="jsonData"></json-viewer>
  </div>
</template>

<script>
import JsonViewer from "vue-json-viewer";
export default {
  components: { JsonViewer },
  data() {
    return {
      jsonData: {
        total: 25,
        limit: 10,
        skip: 0,
        links: {
          previous: undefined,
          next: function() {},
        },
      },
    };
  },
};
</script>

实现效果

五、主题样式

有两个办法创建自定义主题 (e.g. my-awesome-json-theme)

添加 theme="my-awesome-json-theme" JsonViewer 的组件属性;

复制粘贴下面的模板并且根据自定义的theme名称做对应调整。

// values are default one from jv-light template
.my-awesome-json-theme {
  background: #fff;
  white-space: nowrap;
  color: #525252;
  font-size: 14px;
  font-family: Consolas, Menlo, Courier, monospace;

  .jv-ellipsis {
    color: #999;
    background-color: #eee;
    display: inline-block;
    line-height: 0.9;
    font-size: 0.9em;
    padding: 0px 4px 2px 4px;
    border-radius: 3px;
    vertical-align: 2px;
    cursor: pointer;
    user-select: none;
  }
  .jv-button { color: #49b3ff }
  .jv-key { color: #111111 }
  .jv-item {
    &.jv-array { color: #111111 }
    &.jv-boolean { color: #fc1e70 }
    &.jv-function { color: #067bca }
    &.jv-number { color: #fc1e70 }
    &.jv-number-float { color: #fc1e70 }
    &.jv-number-integer { color: #fc1e70 }
    &.jv-object { color: #111111 }
    &.jv-undefined { color: #e08331 }
    &.jv-string {
      color: #42b983;
      word-break: break-word;
      white-space: normal;
    }
  }
  .jv-code {
    .jv-toggle {
      &:before {
        padding: 0px 2px;
        border-radius: 2px;
      }
      &:hover {
        &:before {
          background: #eee;
        }
      }
    }
  }
}

实现效果

六、结合业务需求实现代码

<template>
  <div class="serviceTesting">
    <div class="nav">
      <span />
      <h3>接口数据测试</h3>
    </div>
    <el-card class="box-card">
      <div class="content">
        <p>接口</p>
        <el-select
          v-model="form.address"
          clearable
          placeholder="请选择内置接口"
          @change="onChange"
        >
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          >
          </el-option>
        </el-select>
        <p>GET</p>
        <el-input v-model="form.way" placeholder="请输入接口地址" disabled> </el-input>
        <el-button
          type="primary"
          icon="el-icon-s-promotion"
          :disabled="throttle"
          @click="onSend"
          >发送</el-button
        >
      </div>
      <div class="forms">
        <h4>参数列表</h4>
        <div class="line" />
        <el-table :data="tableData" border style="width: 100%">
          <el-table-column prop="name" label="参数名">
            <template slot-scope="scope">
              <el-input v-model="scope.row.name" clearable size="mini"></el-input>
            </template>
          </el-table-column>
          <el-table-column prop="value" label="参数值">
            <template slot-scope="scope">
              <el-input v-model="scope.row.value" clearable size="mini"></el-input>
            </template>
          </el-table-column>
          <el-table-column prop="required" label="是否必填">
            <template slot-scope="scope">
              <el-switch
                v-model="scope.row.must"
                active-color="#13ce66"
                inactive-color="#ff4949"
                disabled
              >
              </el-switch>
            </template>
          </el-table-column>
          <el-table-column prop="describe" label="参数描述"></el-table-column>
        </el-table>
      </div>
    </el-card>

    <div
      v-loading="throttle"
      element-loading-text="拼命加载中"
      element-loading-spinner="el-icon-loading"
      element-loading-background="rgba(0, 0, 0, 0.8)"
      :value="content"
      class="result"
    >
      <el-card class="box-card">
        <h4>响应结果</h4>
        <div class="line" />
        <json-viewer
          v-if="content !== null"
          :copyable="{ copyText: '复制', copiedText: '已复制' }"
          theme="my-awesome-json-theme"
          :preview-mode="true"
        ></json-viewer>
        <div v-else>
          <el-empty description="选择接口输入参数点击发送按钮获取响应结果"></el-empty>
        </div>
      </el-card>
    </div>
  </div>
</template>

<script>
  import JsonViewer from 'vue-json-viewer'
  export default {
    components: {
      JsonViewer
    },
    data() {
      return {
        options: [
          {
            value: '0',
            label: '测试接口1'
          },
          {
            value: '1',
            label: '测试接口2'
          }
        ],
        form: {
          address: '',
          way: ''
        },
        tableData: [
          {
            name: '',
            value: '',
            must: false,
            describe: ''
          }
        ],
        content: null,
        throttle: false
      }
    },
    methods: {
      onSend() {
        if (!this.form.address) {
          this.$message.warning('请选择接口地址')
          return
        }
        if (!this.tableData[0].name) {
          this.$message.warning('请输入参数名')
          return
        }
        if (!this.tableData[0].value) {
          this.$message.warning('请输入参数值')
          return
        }
        this.throttle = true
        // 请求接口
        port({}).then(res => {
          this.throttle = false
          if (res.code === '0') {
            this.content = res.data
          }
        })
      },
      onChange() {
        this.content = null
        this.tableData = [
          {
            name: '',
            value: '',
            must: false,
            describe: ''
          }
        ]
      }
    }
  }
</script>

<style lang="less" scoped>
  .serviceTesting {
    padding: 16px;
    .nav {
      display: flex;
      align-items: center;
      margin-bottom: 16px;
      span {
        display: inline-block;
        width: 8px;
        height: 22px;
        background: #409eff;
        margin-right: 5px;
      }
    }
    .content {
      display: flex;
      align-items: center;
      margin-bottom: 10px;
      .el-select {
        width: 300px;
        margin-right: 10px;
      }
      p {
        font-weight: bold;
        min-width: 30px;
        margin-right: 10px;
      }
      .el-button {
        margin-left: 10px;
      }
    }
    .el-card {
      padding: 10px;
    }
    h4 {
      text-align: left;
    }
    .line {
      width: 100%;
      height: 1px;
      background: rgb(246, 246, 246);
      margin: 10px 0;
    }
    .result {
      margin-top: 16px;
    }
  }
  ::v-deep {
    .el-card .el-card__body {
      text-align: left;
    }
    .my-awesome-json-theme {
      background: #fff;
      white-space: nowrap;
      color: #525252;
      font-size: 14px;
      font-family: Consolas, Menlo, Courier, monospace;

      .jv-ellipsis {
        color: #999;
        background-color: #eee;
        display: inline-block;
        line-height: 0.9;
        font-size: 0.9em;
        padding: 0px 4px 2px 4px;
        border-radius: 3px;
        vertical-align: 2px;
        cursor: pointer;
        user-select: none;
      }
      .jv-button {
        color: #49b3ff;
      }
      .jv-key {
        color: #111111;
      }
      .jv-item {
        &.jv-array {
          color: #111111;
        }
        &.jv-boolean {
          color: #fc1e70;
        }
        &.jv-function {
          color: #067bca;
        }
        &.jv-number {
          color: #fc1e70;
        }
        &.jv-number-float {
          color: #fc1e70;
        }
        &.jv-number-integer {
          color: #fc1e70;
        }
        &.jv-object {
          color: #111111;
        }
        &.jv-undefined {
          color: #e08331;
        }
        &.jv-string {
          color: #42b983;
          word-break: break-word;
          white-space: normal;
        }
      }
      .jv-code {
        .jv-toggle {
          &:before {
            padding: 0px 2px;
            border-radius: 2px;
          }
          &:hover {
            &:before {
              background: #eee;
            }
          }
        }
      }
    }
  }
</style>

实现效果

到此这篇关于使用vue-json-viewer实现JSON数据可视化详解的文章就介绍到这了,更多相关vue-json-viewer JSON数据可视化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-nuxt 登录鉴权的实现

    vue-nuxt 登录鉴权的实现

    本文主要介绍了vue-nuxt 登录鉴权的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • vue中监听scroll事件失效的问题及解决

    vue中监听scroll事件失效的问题及解决

    这篇文章主要介绍了vue中监听scroll事件失效的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue3实现HTML内容预览功能

    Vue3实现HTML内容预览功能

    这篇文章主要为大家详细介绍了如何使用Vue3实现HTML内容预览功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Vue filter 过滤器、以及在table中的使用介绍

    Vue filter 过滤器、以及在table中的使用介绍

    这篇文章主要介绍了Vue filter 过滤器、以及在table中的使用介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue实现Hover功能(mouseover与mouseenter的区别及说明)

    Vue实现Hover功能(mouseover与mouseenter的区别及说明)

    这篇文章主要介绍了Vue实现Hover功能(mouseover与mouseenter的区别及说明),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 前端新手小白的Vue3入坑超详细指南

    前端新手小白的Vue3入坑超详细指南

    这篇文章主要介绍了如何使用Vite安装和启动Vue3项目,并推荐了一些常用的第三方库,如js-tool-big-box、less或sass预处理器、axios请求库以及Element Plus UI库,需要的朋友可以参考下
    2024-12-12
  • Vue对象的深层劫持详细讲解

    Vue对象的深层劫持详细讲解

    这篇文章主要介绍了vue2.x对象深层劫持的原理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Vue子组件向父组件通信与父组件调用子组件中的方法

    Vue子组件向父组件通信与父组件调用子组件中的方法

    这篇文章主要介绍了Vue子组件向父组件通信与父组件调用子组件中的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 在Vue中使用Echarts可视化库的完整步骤记录

    在Vue中使用Echarts可视化库的完整步骤记录

    这篇文章主要给大家介绍了关于在Vue中使用Echarts可视化库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果

    使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果

    这篇文章主要介绍了用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果,代码简单易懂,非常不错,具有一定的参考借鉴价值需要的朋友可以参考下
    2019-08-08

最新评论