自己DIY出来一个JSON结构化展示器

说来也巧,这个玩意,一直都想亲手写一个,因为一直用着各种网上提供的工具,觉得这个还是有些用途,毕竟,后面的实现思路和原理不是太复杂,就是对json的遍历,然后给予不同节点类型以不同的展现风格。

我这次,是出于将一个专利写清楚,自己构思了一个实现方案,且还能显示出当前的路径,具体的显示风格,依据自己的喜好,随便DIY吧。

写这个JSON展示器,其实有很多用处,不仅仅就是为了看一个json的结构化展示

1. 更重要的是可以辅助用户和json数据进行交互,能够知道用户感兴趣的json字段是什么,可以对这个字段配置相关的数据操作函数

2. 获取用户选择的数据元素的路径,实现json数据格式的扁平化操作,即将一个深度结构化的数据变形为一个一位数组的形式

下面直接上代码,具体逻辑不用细说,全在代码里。

1. demo.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONviewer</title>
<script src="./jquery.min.js"></script>
<script src="./traverse.js"></script>
<link href="./traverse.css" rel="stylesheet"/>
</head>
<body>
    <div id="container" style="align: left, font-family: ‘DejaVu Sans Mono‘,‘Courier New‘,monospace;">
        <h1 style="color: red">Intelligent JSON Viewer</h1>
        <div id="main">
        </div>
        <script>
            var str = traverseJson(arr)
            console.log($(‘#main‘))
            $(‘#main‘).append(str)
        </script>
    </div>
</body>
</html>

2. traverse.js

这个js是本结构化展示器的核心内容,这里只是一个雏形,UI部分可以根据需要进行美化。

//测试用的JSON对象
var arr={
    "a":‘a1‘,
    "b":‘b1‘,
    "c":{"c1":‘c11‘,"c2":‘c22‘},
    "d":[‘d1‘,‘d2‘],
    "e":{"e1":[‘e11‘,‘e12‘], "e2":[‘e21‘,‘e22‘,‘e23‘]},
    "f":[{"f11":‘vf11‘,"f12":‘vf12‘},{"f21":‘vf21‘,"f22":‘vf22‘}],
    "g":[[‘g11‘,‘g12‘],[‘g21‘,‘g22‘]],
    "h":{"h1":{‘h11‘:‘h12‘}, "h2":{‘h21‘:‘h22‘}},
    "i":{"i1":{‘i11‘:{‘i111‘:‘vi111‘, ‘i112‘:‘vi112‘}}, "i2":{‘i21‘:{‘i211‘:‘vi211‘, ‘i212‘:‘vi212‘}}}
}
/**
 * 遍历一个JSON对象的所有成员,然后构建成一段html代码片段。ul、li组合嵌套,实现,li节点的key为json的key
 */
function traverseJson(jsonObj) {
    var htmlStr=‘<ul key="rootj" class="ul_class">‘;
    for(var obj in jsonObj){
        htmlStr += ‘<li class="li_class" key="‘+obj+‘">‘+‘<span class="span_class">‘ +obj+‘</span>:‘
        if(!(jsonObj[obj] instanceof Object) && !(jsonObj[obj] instanceof Array)){ //基本key-value类型
            htmlStr += jsonObj[obj]
        }else if(jsonObj[obj] instanceof Object && !(jsonObj[obj] instanceof Array)){ //嵌套json类型
            var str1 = traverseJson(jsonObj[obj])
            htmlStr += str1;
        }else if(jsonObj[obj] instanceof Object && jsonObj[obj] instanceof Array){ //嵌套数组类型
            htmlStr += ‘<ul class="ul_class" key="‘+obj+‘">‘
            for(var i=0;i<jsonObj[obj].length;i++){
                htmlStr += ‘<li class="li_class" key="‘+i+‘">‘+ ‘<span class="span_class">‘+i+‘</span>:‘
                if(!(jsonObj[obj][i] instanceof Object) && !(jsonObj[obj][i] instanceof Array)){
                    htmlStr += jsonObj[obj][i]
                }else {
                    htmlStr += traverseJson(jsonObj[obj][i])
                }
                htmlStr += ‘</li>‘
            }
            htmlStr += ‘</ul>‘
        }
        htmlStr += ‘</li>‘
    }
    htmlStr += ‘</ul>‘
    return htmlStr;
}
/**
 * 实现数据整形,将一个数组对象的成员元素,变形为一个json对象的成员选择逻辑风格。
 * e.g: 数组内容: a,b,1,c,0,0,d
 *      变形结构:  a.b[1].c[0][0].d
 */
function reshape(pathArray){
    var res = ‘‘
    if(pathArray.length <= 0){
        return res
    }
    for(var item in pathArray){
        var el = pathArray[item]
        //console.log(el)
        if(!isNaN(parseInt(el))){
            var ress = res.charAt(res.length-1)
            if(ress == ‘.‘){
                res = res.substring(0,res.length-1)
            }
            res += ‘[‘ + el + ‘].‘
        }else{
            res += el + ‘.‘
        }
    }
    if(res.charAt(res.length-1) === ‘.‘){
        res = res.substring(0,res.length-1)
    }
    return res
}
$(function(){
    /*
     * 点击选中json的某个属性名后,获取当前属性名与json根节点之间的路径
     */
    $(".span_class").click(function (e) {
        var route=[]
        var parents = $(this).parents(‘.li_class‘)
        for(var i=0;i<parents.length;i++){
            var node = parents[i]
            if(node.className==‘li_class‘){
                route.unshift(node.getAttribute(‘key‘))
            }
        }
        var path = reshape(route)
        route=route.join(‘->‘)
        var out = route + " : " + path
        console.log(out)
        alert(out)
    })
})

3. traverse.css

.ul_class {
    padding-left: 30px;
}

.li_class {
    font-family: ‘DejaVu Sans Mono‘,‘Courier New‘,monospace;
    font-size: 15px;
    line-height: 12px;
    word-wrap: break-word;
}
.span_class:hover {
    color: red;
    font-size: 20px;
    line-height: 18px;
    cursor: pointer;
    font-weight:bold;
}

下面,将上述代码运行的效果,截图分享下,一睹为快

选择了元素后并点击节点的效果:

原文地址:https://www.cnblogs.com/shihuc/p/10382771.html

时间: 2024-10-13 02:35:18

自己DIY出来一个JSON结构化展示器的相关文章

【中文分词】结构化感知器SP

结构化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出来的,用于解决序列标注的问题.中文分词工具THULAC.LTP所采用的分词模型便是基于此. 1. 结构化感知器 模型 CRF全局化地以最大熵准则建模概率P(Y|X)P(Y|X):其中,XX为输入序列xn1x1n,YY为标注序列yn1y1n.不同于CRF,SP则是(同样以最大熵准则)建模score函数: S(Y,X)=∑sαsΦs(Y,X)S(Y,X)=∑sαsΦs(Y,X) 其中,

一个Json结构对比的Python小工具兼谈编程求解问题

先上代码. jsondiff.py #_*_encoding:utf-8_*_ import argparse import json import sys reload(sys) sys.setdefaultencoding('utf-8') def parseArgs(): description = 'This program is used to output the differences of keys of two json data.' parser = argparse.Arg

用c#写一个json的万能解析器

CommonJsonModel .cs /// <summary> /// 万能JSON解析器 /// </summary> public class CommonJsonModel : CommonJsonModelAnalyze { private string rawjson; private bool isValue = false; private bool isModel = false; private bool isCollection = false; inter

Salesforce开源TransmogrifAI:用于结构化数据的端到端AutoML库

AutoML 即通过自动化的机器学习实现人工智能模型的快速构建,它可以简化机器学习流程,方便更多人利用人工智能技术.近日,软件行业巨头 Salesforce 开源了其 AutoML 库 TransmogrifAI.Salesforce Einstein 数据科学高级总监 Shubha Nabar 在 Medium 上撰文介绍了该 AutoML 库,包括工作流程和设计原则等. GitHub 链接:https://github.com/salesforce/TransmogrifAI Transmo

什么是结构化数据?什么是半结构化数据?

概述 相对于结构化数据(即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据)而言,不方便用数据库二维逻辑表来表现的数据即称为非结构化数据,包括所有格式的办公文档.文本.图片.XML.HTML.各类报表.图像和音频/视频信息等等. 非结构化数据库是指其字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成的数据库,用它不仅可以处理结构化数据(如数字.符号等信息)而且更适合处理非结构化数据(全文文本.图象.声音.影视.超媒体等信息). 非结构化WEB数据库主要是针对非结构化

Asp.Net Core中利用Seq组件展示结构化日志功能

在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看,果然,很多东西没掌握,至此,花点时间看了下日志的相关操作.利用日志服务来查看日志数据. 本文地址:https://www.cnblogs.com/CKExp/p/9246788.html 本文Demo的地址:https://gitee.com/530521314/LogPanel.git 一.日志

用结构化思维策划一个会议

引言:一个复杂问题进行拆分,最后会形成一个数量巨大的细分问题群.如果没有严格的按照"逐层不漏不重"原则进行,细分出的问题将很难形成合力来完整有效地支撑解决原问题.本文以策划一个会议为例,来了解结构化思维的应用. 本文选自<数源思维:业务导向的数据思维秘籍>. 在对问题进行拆分时,应该采用什么样的逻辑或者结构呢? 当然最直接的办法就是采用前人已经总结好的问题思考框架,比如在战略分析领域有经典的SWOT框架.BCG矩阵或GE矩阵(图1)等. 图1 GE矩阵 在外部环境分析时有波

Atitit 大json文件的结构化查看解决方案,高性能的jsonview &#160;attilax总结.docx

Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonobject jsonarray位置..1 1.3. 现存问题  fastjson使用string格式的内容,导致文件内容大小依然存在上限..1 1.4. 效果2 1.5. 参考资料4 选型了很多jsonviewer,只能对小数据量的文件生效..一旦涉及到9M左右的json文件,就都统统歇菜了.. 只好

ES6语法将扁平的JSON对象结构化

适用于支持ES6语法的项目中. Form表单提交整个Table的数据,每单个表单必须有唯一的name,当数据量较大时,不可能去手动设置每一个name名. 因此通过遍历出有规律的name,然后通过Form表单提交所有数据,再去处理数据,将其转为分类的结构化数据,作为参数传给后端. const obj = { id0: 'id000', id1: 'id001', id2: 'id002', num0: 'num000', num1: 'num001', num2: 'num002', card0: