Pretty Printing JSON with React

后端 未结 5 2124
醉酒成梦
醉酒成梦 2020-12-23 14:23

I\'m using ReactJS and part of my app requires pretty printed JSON.

I get some JSON like: { \"foo\": 1, \"bar\": 2 }, and if I run that through

相关标签:
5条回答
  • 2020-12-23 14:39

    Just to extend on the WiredPrairie's answer a little, a mini component that can be opened and closed.

    Can be used like:

    <Pretty data={this.state.data}/>
    

    export default React.createClass({
    
        style: {
            backgroundColor: '#1f4662',
            color: '#fff',
            fontSize: '12px',
        },
    
        headerStyle: {
            backgroundColor: '#193549',
            padding: '5px 10px',
            fontFamily: 'monospace',
            color: '#ffc600',
        },
    
        preStyle: {
            display: 'block',
            padding: '10px 30px',
            margin: '0',
            overflow: 'scroll',
        },
    
        getInitialState() {
            return {
                show: true,
            };
        },
    
        toggle() {
            this.setState({
                show: !this.state.show,
            });
        },
    
        render() {
            return (
                <div style={this.style}>
                    <div style={this.headerStyle} onClick={ this.toggle }>
                        <strong>Pretty Debug</strong>
                    </div>
                    {( this.state.show ?
                        <pre style={this.preStyle}>
                            {JSON.stringify(this.props.data, null, 2) }
                        </pre> : false )}
                </div>
            );
        }
    });
    

    Update

    A more modern approach (now that createClass is on the way out)

    import styles from './DebugPrint.css'
    
    import autoBind from 'react-autobind'
    import classNames from 'classnames'
    import React from 'react'
    
    export default class DebugPrint extends React.PureComponent {
      constructor(props) {
        super(props)
        autoBind(this)
        this.state = {
          show: false,
        }
      }    
    
      toggle() {
        this.setState({
          show: !this.state.show,
        });
      }
    
      render() {
        return (
          <div style={styles.root}>
            <div style={styles.header} onClick={this.toggle}>
              <strong>Debug</strong>
            </div>
            {this.state.show 
              ? (
                <pre style={styles.pre}>
                  {JSON.stringify(this.props.data, null, 2) }
                </pre>
              )
              : null
            }
          </div>
        )
      }
    }
    

    And your style file

    .root { backgroundColor: '#1f4662'; color: '#fff'; fontSize: '12px'; }

    .header { backgroundColor: '#193549'; padding: '5px 10px'; fontFamily: 'monospace'; color: '#ffc600'; }

    .pre { display: 'block'; padding: '10px 30px'; margin: '0'; overflow: 'scroll'; }

    0 讨论(0)
  • 2020-12-23 14:45

    The 'react-json-view' provides solution rendering json string.

    import ReactJson from 'react-json-view';
    <ReactJson src={my_important_json} theme="monokai" />
    
    0 讨论(0)
  • 2020-12-23 14:45
    const getJsonIndented = (obj) => JSON.stringify(newObj, null, 4).replace(/["{[,\}\]]/g, "")
    
    const JSONDisplayer = ({children}) => (
        <div>
            <pre>{getJsonIndented(children)}</pre>
        </div>
    )
    

    Then you can easily use it:

    const Demo = (props) => {
       ....
       return <JSONDisplayer>{someObj}<JSONDisplayer>
    }
    
    0 讨论(0)
  • 2020-12-23 14:45

    Here is a demo react_hooks_debug_print.html in react hooks that is based on Chris's answer. The json data example is from https://json.org/example.html.

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    
        <!-- Don't use this in production: -->
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script src="https://raw.githubusercontent.com/cassiozen/React-autobind/master/src/autoBind.js"></script>
    
        <script type="text/babel">
    
    let styles = {
      root: { backgroundColor: '#1f4662', color: '#fff', fontSize: '12px', },
      header: { backgroundColor: '#193549', padding: '5px 10px', fontFamily: 'monospace', color: '#ffc600', },
      pre: { display: 'block', padding: '10px 30px', margin: '0', overflow: 'scroll', }
    }
    
    let data = {
      "glossary": {
        "title": "example glossary",
        "GlossDiv": {
          "title": "S",
          "GlossList": {
            "GlossEntry": {
              "ID": "SGML",
              "SortAs": "SGML",
              "GlossTerm": "Standard Generalized Markup Language",
              "Acronym": "SGML",
              "Abbrev": "ISO 8879:1986",
              "GlossDef": {
                "para": "A meta-markup language, used to create markup languages such as DocBook.",
                "GlossSeeAlso": [
                  "GML",
                  "XML"
                ]
              },
              "GlossSee": "markup"
            }
          }
        }
      }
    }
    
    const DebugPrint = () => {
      const [show, setShow] = React.useState(false);
    
      return (
        <div key={1} style={styles.root}>
        <div style={styles.header} onClick={ ()=>{setShow(!show)} }>
            <strong>Debug</strong>
        </div>
        { show 
          ? (
          <pre style={styles.pre}>
           {JSON.stringify(data, null, 2) }
          </pre>
          )
          : null
        }
        </div>
      )
    }
    
    ReactDOM.render(
      <DebugPrint data={data} />, 
      document.getElementById('root')
    );
    
        </script>
    
      </body>
    </html>
    
    

    Or in the following way, add the style into header:

        <style>
    .root { background-color: #1f4662; color: #fff; fontSize: 12px; }
    .header { background-color: #193549; padding: 5px 10px; fontFamily: monospace; color: #ffc600; }
    .pre { display: block; padding: 10px 30px; margin: 0; overflow: scroll; }
        </style>
    

    And replace DebugPrint with the follows:

    const DebugPrint = () => {
      // https://stackoverflow.com/questions/30765163/pretty-printing-json-with-react
      const [show, setShow] = React.useState(false);
    
      return (
        <div key={1} className='root'>
        <div className='header' onClick={ ()=>{setShow(!show)} }>
            <strong>Debug</strong>
        </div>
        { show 
          ? (
          <pre className='pre'>
           {JSON.stringify(data, null, 2) }
          </pre>
          )
          : null
        }
        </div>
      )
    }
    
    0 讨论(0)
  • 2020-12-23 14:49

    You'll need to either insert BR tag appropriately in the resulting string, or use for example a PRE tag so that the formatting of the stringify is retained:

    var data = { a: 1, b: 2 };
    
    var Hello = React.createClass({
        render: function() {
            return <div><pre>{JSON.stringify(data, null, 2) }</pre></div>;
        }
    });
    
    React.render(<Hello />, document.getElementById('container'));
    

    Working example.

    Update

    class PrettyPrintJson extends React.Component {
        render() {
             // data could be a prop for example
             // const { data } = this.props;
             return (<div><pre>{JSON.stringify(data, null, 2) }</pre></div>);
        }
    }
    
    ReactDOM.render(<PrettyPrintJson/>, document.getElementById('container'));
    

    Example

    Stateless Functional component, React .14 or higher

    const PrettyPrintJson = ({data}) => {
        // (destructured) data could be a prop for example
        return (<div><pre>{ JSON.stringify(data, null, 2) }</pre></div>);
    }
    

    Or, ...

    const PrettyPrintJson = ({data}) => (<div><pre>{ 
        JSON.stringify(data, null, 2) }</pre></div>);
    

    Working example

    Memo / 16.6+

    (You might even want to use a memo, 16.6+)

    const PrettyPrintJson = React.memo(({data}) => (<div><pre>{
        JSON.stringify(data, null, 2) }</pre></div>));
    
    0 讨论(0)
提交回复
热议问题