加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

react 解析json

发布时间:2020-12-15 20:24:17 所属栏目:百科 来源:网络整理
导读:页面需要展示返回的参数,cto给了一个js包,但是要放在react上面运用? // Copyright ? 2013-2017 David Caldwell [email?protected] //// Permission to use,copy,modify,and/or distribute this software for any // purpose with or without fee is hereby

页面需要展示返回的参数,cto给了一个js包,但是要放在react上面运用?

// Copyright ? 2013-2017 David Caldwell <[email?protected]>
//
// Permission to use,copy,modify,and/or distribute this software for any
// purpose with or without fee is hereby granted,provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// SPECIAL,DIRECT,INDIRECT,OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE,DATA OR PROFITS,WHETHER IN AN ACTION
// OF CONTRACT,NEGLIGENCE OR OTHER TORTIOUS ACTION,ARISING OUT OF OR IN
// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

// Usage
// -----
// The module exports one entry point,the `renderjson()` function. It takes in
// the JSON you want to render as a single argument and returns an HTML
// element.
//
// Options
// -------
// renderjson.set_icons("+","-")
//   This Allows you to override the disclosure icons.
//
// renderjson.set_show_to_level(level)
//   Pass the number of levels to expand when rendering. The default is 0,which
//   starts with everything collapsed. As a special case,if level is the string
//   "all" then it will start with everything expanded.
//
// renderjson.set_max_string_length(length)
//   Strings will be truncated and made expandable if they are longer than
//   `length`. As a special case,if `length` is the string "none" then
//   there will be no truncation. The default is "none".
//
// renderjson.set_sort_objects(sort_bool)
//   Sort objects by key (default: false)
//
// renderjson.set_replacer(replacer_function)
//   Equivalent of JSON.stringify() `replacer` argument when it‘s a function
//
// renderjson.set_property_list(property_list)
//   Equivalent of JSON.stringify() `replacer` argument when it‘s an array
//
// Theming
// -------
// The HTML output uses a number of classes so that you can theme it the way
// you‘d like:
//     .disclosure    ("⊕","?")
//     .syntax        (",",":","{","}","[","]")
//     .string        (includes quotes)
//     .number
//     .boolean
//     .key           (object key)
//     .keyword       ("null","undefined")
//     .object.syntax ("{","}")
//     .array.syntax  ("[","]")

var module,window,define,renderjson=(function() {
    var themetext = function(/* [class,text]+ */) {
        var spans = [];
        while (arguments.length)
            spans.push(append(span(Array.prototype.shift.call(arguments)),text(Array.prototype.shift.call(arguments))));
        return spans;
    };
    var append = function(/* el,... */) {
        var el = Array.prototype.shift.call(arguments);
        for (var a=0; a<arguments.length; a++)
            if (arguments[a].constructor == Array)
                append.apply(this,[el].concat(arguments[a]));
            else
                el.appendChild(arguments[a]);
        return el;
    };
    var prepend = function(el,child) {
        el.insertBefore(child,el.firstChild);
        return el;
    }
    var isempty = function(obj,pl) { var keys = pl || Object.keys(obj);
                                      for (var i in keys) if (Object.hasOwnProperty.call(obj,keys[i])) return false;
                                      return true; }
    var text = function(txt) { return document.createTextNode(txt) };
    var div = function() { return document.createElement("div") };
    var span = function(classname) { var s = document.createElement("span");
                                     if (classname) s.className = classname;
                                     return s; };
    var A = function A(txt,classname,callback) { var a = document.createElement("a");
                                                   if (classname) a.className = classname;
                                                   a.appendChild(text(txt));
                                                   a.href = ‘#‘;
                                                   a.onclick = function(e) { callback(); if (e) e.stopPropagation(); return false; };
                                                   return a; };

    function _renderjson(json,indent,dont_indent,show_level,options) {
        var my_indent = dont_indent ? "" : indent;

        var disclosure = function(open,placeholder,close,type,builder) {
            var content;
            var empty = span(type);
            var show = function() { if (!content) append(empty.parentNode,content = prepend(builder(),A(options.hide,"disclosure",function() { content.style.display="none";
                                                                                          empty.style.display="inline"; } )));
                                    content.style.display="inline";
                                    empty.style.display="none"; };
            append(empty,A(options.show,show),themetext(type+ " syntax",open),A(placeholder,null,close));

            var el = append(span(),text(my_indent.slice(0,-1)),empty);
            if (show_level > 0 && type != "string")
                show();
            return el;
        };

        if (json === null) return themetext(null,my_indent,"keyword","null");
        if (json === void 0) return themetext(null,"undefined");

        if (typeof(json) == "string" && json.length > options.max_string_length)
            return disclosure(‘"‘,json.substr(0,options.max_string_length)+" ...",‘"‘,"string",function () {
                return append(span("string"),themetext(null,"string",JSON.stringify(json)));
            });

        if (typeof(json) != "object" || [Number,String,Boolean,Date].indexOf(json.constructor) >= 0) // Strings,numbers and bools
            return themetext(null,typeof(json),JSON.stringify(json));

        if (json.constructor == Array) {
            if (json.length == 0) return themetext(null,"array syntax","[]");

            return disclosure("["," ... ","]","array",function () {
                var as = append(span("array"),themetext("array syntax",null,"n"));
                for (var i=0; i<json.length; i++)
                    append(as,_renderjson(options.replacer.call(json,i,json[i]),indent+"    ",false,show_level-1,options),i != json.length-1 ? themetext("syntax",") : [],text("n"));
                append(as,themetext(null,"]"));
                return as;
            });
        }

        // object
        if (isempty(json,options.property_list))
            return themetext(null,"object syntax","{}");

        return disclosure("{","...","object",function () {
            var os = append(span("object"),themetext("object syntax","n"));
            for (var k in json) var last = k;
            var keys = options.property_list || Object.keys(json);
            if (options.sort_objects)
                keys = keys.sort();
            for (var i in keys) {
                var k = keys[i];
                if (!(k in json)) continue;
                append(os,indent+"    ","key",‘"‘+k+‘"‘,‘: ‘),k,json[k]),true,k != last ? themetext("syntax",text("n"));
            }
            append(os,"}"));
            return os;
        });
    }

    var renderjson = function renderjson(json)
    {
        var options = Object.assign({},renderjson.options);
        options.replacer = typeof(options.replacer) == "function" ? options.replacer : function(k,v) { return v; };
        var pre = append(document.createElement("pre"),_renderjson(json,"",false,options.show_to_level,options));
        pre.className = "renderjson";
        return pre;
    }
    renderjson.set_icons = function(show,hide) { renderjson.options.show = show;
                                                  renderjson.options.hide = hide;
                                                  return renderjson; };
    renderjson.set_show_to_level = function(level) { renderjson.options.show_to_level = typeof level == "string" &&
                                                                                        level.toLowerCase() === "all" ? Number.MAX_VALUE
                                                                                                                      : level;
                                                     return renderjson; };
    renderjson.set_max_string_length = function(length) { renderjson.options.max_string_length = typeof length == "string" &&
                                                                                                 length.toLowerCase() === "none" ? Number.MAX_VALUE
                                                                                                                                 : length;
                                                          return renderjson; };
    renderjson.set_sort_objects = function(sort_bool) { renderjson.options.sort_objects = sort_bool;
                                                        return renderjson; };
    renderjson.set_replacer = function(replacer) { renderjson.options.replacer = replacer;
                                                   return renderjson; };
    renderjson.set_property_list = function(prop_list) { renderjson.options.property_list = prop_list;
                                                         return renderjson; };
    // Backwards compatiblity. Use set_show_to_level() for new code.
    renderjson.set_show_by_default = function(show) { renderjson.options.show_to_level = show ? Number.MAX_VALUE : 0;
                                                      return renderjson; };
    renderjson.options = {};
    renderjson.set_icons(‘⊕‘,‘?‘);
    renderjson.set_show_by_default(true);
    renderjson.set_sort_objects(false);
    renderjson.set_max_string_length("none");
    renderjson.set_replacer(void 0);
    renderjson.set_property_list(void 0);
    return renderjson;
})();

// if (define) define({renderjson:renderjson})
// else (module||{}).exports = (window||{}).renderjson = renderjson;
export default renderjson;

没法上传附件,就直接贴出代码了,还有css样式

.renderjson a {
    text-decoration: none;
}

.renderjson .disclosure {
    color: crimson;
    font-size: 100%;
}

.renderjson .syntax {
    color: grey;
}

.renderjson .string {
    color: darkred;
}

.renderjson .number {
    color: darkcyan;
}

.renderjson .boolean {
    color: blueviolet;
}

.renderjson .key {
    color: darkblue;
}

.renderjson .keyword {
    color: blue;
}

.renderjson .object.syntax {
    color: lightseagreen;
}

.renderjson .array.syntax {
    color: orange;
}

接下来是封装一下这个原生的文件

import React from "react";
import renderjson from "./renderJson.js";
import "./renderjson.css";

export default class RenderJson extends React.Component {
  componentDidMount() {
    const json = renderjson(JSON.parse(this.props.json));
    this.refs.dom.innerHTML = ‘‘;
    this.refs.dom.appendChild(json);
  }
  render() {
    return <div ref="dom" />;
  }
}

最后的展示效果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读