json可视化在vue应用中的实现

 实现效果:json可视化化

代码:

1.首先先下载好JsonView的组件:JsonView.vue,组件代码如下:

<template>
  <div class="bgView">
    <div :class="['json-view', length ? 'closeable' : '']" :style="'font-size:' + fontSize+'px'">
    <span @click="toggleClose" :class="['angle', innerclosed ? 'closed' : '']" v-if="length">
    </span>
      <div class="content-wrap">
        <p class="first-line">
          <span v-if="jsonKey" class="json-key">"{{jsonKey}}": </span>
          <span v-if="length">
          {{prefix}}
          {{innerclosed ? ('...' + subfix) : ''}}
          <span class="json-note">
           {{innerclosed ? (' // count: ' + length) : ''}}
          </span>
        </span>
          <span v-if="!length">{{isArray ? '[]' : '{}'}}</span>
        </p>
        <div v-if="!innerclosed && length" class="json-body">
          <template v-for="(item, index) in items">
            <json-view :closed="closed" v-if="item.isJSON" :key="index" :json="item.value"
                       :jsonKey="item.key" :isLast="index === items.length - 1"></json-view>
            <p class="json-item" v-else :key="index">
            <span class="json-key">
                {{(isArray ? '' : '"' + item.key + '"')}}
            </span>
              :
              <span class="json-value">
                {{item.value + (index === items.length - 1 ? '' : ',')}}
            </span>
            </p>
          </template>
          <span v-show="!innerclosed" class="body-line"></span>
        </div>
        <p v-if="!innerclosed && length" class="last-line">
          <span>{{subfix}}</span>
        </p>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'jsonView',
    props: {
      json: [Object, Array],
      jsonKey: {
        type: String,
        default: ''
      },
      closed: {
        type: Boolean,
        default: false
      },
      isLast: {
        type: Boolean,
        default: true
      },
      fontSize: {
        type: Number,
        default: 13
      }
    },
    created() {
      this.innerclosed = this.closed
      this.$watch('closed', () => {
        this.innerclosed = this.closed
      })
    },
    data() {
      return {
        innerclosed: true
      }
    },
    methods: {
      isObjectOrArray(source) {
        const type = Object.prototype.toString.call(source)
        const res = type === '[object Array]' || type === '[object Object]'
        return res
      },
      toggleClose() {
        if (this.innerclosed) {
          this.innerclosed = false
        } else {
          this.innerclosed = true
        }
      }
    },
    computed: {
      isArray() {
        return Object.prototype.toString.call(this.json) === '[object Array]'
      },
      length() {
        return this.isArray ? this.json.length : Object.keys(this.json).length
      },
      subfix() {
        return (this.isArray ? ']' : '}') + (this.isLast ? '' : ',')
      },
      prefix() {
        return this.isArray ? '[' : '{'
      },
      items() {
        if (this.isArray) {
          return this.json.map(item => {
            const isJSON = this.isObjectOrArray(item)
            return {
              value: isJSON ? item : JSON.stringify(item),
              isJSON,
              key: ''
            }
          })
        }
        const json = this.json
        return Object.keys(json).map(key => {
          const item = json[key]
          const isJSON = this.isObjectOrArray(item)
          return {
            value: isJSON ? item : JSON.stringify(item),
            isJSON,
            key
          }
        })
      }
    }
  }
</script>

<style>
  .bgView {
    background-color: #fafafa;
  }

  .json-view {
    position: relative;
    display: block;
    width: 100%;
    height: 100%;
    white-space: nowrap;
    padding-left: 20px;
    box-sizing: border-box;
  }

  .json-note {
    color: #909399;
  }

  .json-key {
    color: rgb(147, 98, 15);
  }

  .json-value {
    color: rgb(24, 186, 24);
  }

  .json-item {
    margin: 0;
    padding-left: 20px;
  }

  .first-line {
    padding: 0;
    margin: 0;
  }

  .json-body {
    position: relative;
    padding: 0;
    margin: 0;
  }

  .json-body .body-line {
    position: absolute;
    height: 100%;
    width: 0;
    border-left: dashed 1px #bbb;
    top: 0;
    left: 2px;
  }

  .last-line {
    padding: 0;
    margin: 0;
  }

  .angle {
    position: absolute;
    display: block;
    cursor: pointer;
    float: left;
    width: 20px;
    text-align: center;
    left: 0;
  }

  .angle::after {
    content: "";
    display: inline-block;
    width: 0;
    height: 0;
    vertical-align: middle;
    border-top: solid 4px #333;
    border-left: solid 6px transparent;
    border-right: solid 6px transparent;
  }

  .angle.closed::after {
    border-left: solid 4px #333;
    border-top: solid 6px transparent;
    border-bottom: solid 6px transparent;
  }
</style>

 2.在需要使用的vue页面中引用JsonView组件

import JsonView from '@/components/JsonView'

3.定义Json数据变量

jsonData:{},

4.页面展示代码

<JsonView :json="jsonData"></JsonView>

JsonView Attributes

JSON(JavaScript Object Notation)是一种常用的数据交换格式,而JavaScript是用于网页开发的脚本语言。实现JSON可视化编辑主要是通过JavaScript来操作JSON对象,并在网页上提供可视化的界面供用户编辑和查看。 在实现JSON可视化编辑时,可以借助于一些JavaScript库和框架,例如jQuery和Vue.js等。首先,需要在网页上引入相关的JavaScript库,并创建一个空的JSON对象作为初始值。然后,通过JavaScript代码来实现JSON对象的增删改查操作。 JSON可视化编辑的主要功能包括:显示JSON数据的结构、编辑JSON数据的内容、添加新的JSON数据、删除已有的JSON数据等。首先,通过JavaScript代码解析JSON数据,将其转换为树状结构或表格的形式展示在网页上。用户可以通过点击展开或折叠的方式查看JSON的层级结构。然后,用户可以在界面上编辑JSON数据的内容,例如修改某个字段的值、添加新的字段等。通过监听用户的操作,及时更新JSON对象的值。用户还可以选择删除已有的JSON数据,通过JavaScript代码将其从JSON对象移除。 在实现JSON可视化编辑时,需要处理一些特殊情况,例如数组类型的数据和嵌套的JSON对象。对于数组,可以通过列表形式展示,并提供添加和删除元素的功能。对于嵌套的JSON对象,可以采用递归的方式展示其子对象,便于用户查看和编辑。 总之,通过使用JavaScript编写代码,结合合适的JavaScript库和框架,可以实现JSON可视化编辑。这样,用户可以通过直观的界面操作JSON数据,提高开发效率和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值