JSON in ấn đẹp với React


92

Tôi đang sử dụng ReactJS và một phần ứng dụng của tôi yêu cầu JSON được in khá đẹp.

Tôi nhận được một số JSON như: { "foo": 1, "bar": 2 }và nếu tôi chạy nó JSON.stringify(obj, null, 4)trong bảng điều khiển của trình duyệt, nó sẽ in khá đẹp, nhưng khi tôi sử dụng nó trong đoạn mã phản ứng này:

render: function() {
  var json = this.getStateFromFlux().json;
  return (
    <div>
      <JsonSubmitter onSubmit={this.onSubmit} />
      { JSON.stringify(json, null, 2) }
    </div>
  );
},

nó hiển thị JSON tổng thể trông như thế nào "{ \"foo\" : 2, \"bar\": 2}\n".

Làm cách nào để các ký tự đó được diễn giải đúng cách? {


4
Bạn đã thử JSON.stringify(json, null, "\t")chưa?
brroshan

Hóa ra tôi đã gặp một lỗi ngớ ngẩn khi this.getStateFromFlux().jsontrả về một chuỗi. Thay vào đó, tôi đã sửa đổi nó để giữ một đối tượng JS và nó hiện hoạt động hoàn hảo.
Brandon

Câu trả lời:


191

Bạn sẽ cần phải chèn BRthẻ một cách thích hợp trong chuỗi kết quả hoặc sử dụng PREthẻ ví dụ để định dạng của stringifyđược giữ lại:

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'));

Ví dụ làm việc .

Cập nhật

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'));

Thí dụ

Thành phần chức năng không trạng thái, React .14 trở lên

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

Hoặc là, ...

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

Ví dụ làm việc

Bản ghi nhớ / 16.6+

(Bạn thậm chí có thể muốn sử dụng một bản ghi nhớ, 16,6+)

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

2
Cám ơn vì cái này! Không biết về tham số JSON.stringify-tùy chọn. Javascript thật tuyệt vời ^^
Marcel Ennix

React hiện không được dùng nữa, hãy sử dụng ReactDOM để thay thế
Brane

Điều này là hoàn hảo - giải pháp đơn giản nhất luôn là tốt nhất! Tôi khuyên bạn nên thêm highlight.js để làm nổi bật cú pháp và làm nổi bật chủ đề.
KeepingItClassy,

cái này thật đẹp
JChao 19/09/18

Giải pháp thẻ <pre> hoạt động hoàn hảo và đó là cách chính xác!
Vikram K

20

Chỉ để mở rộng câu trả lời của WiredPrairie một chút, một thành phần nhỏ có thể mở và đóng.

Có thể được sử dụng như:

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

nhập mô tả hình ảnh ở đây

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>
        );
    }
});

Cập nhật

Một cách tiếp cận hiện đại hơn (bây giờ createClass đang trên đà phát triển)

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>
    )
  }
}

Và tệp phong cách của bạn

.root {backgroundColor: '# 1f4662'; màu: '#fff'; fontSize: '12px'; }

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

.pre {display: 'block'; padding: '10px 30px'; lề: '0'; tràn: 'cuộn'; }


Đây là +1 tuyệt vời chắc chắn! Tôi làm những thứ nhỏ như thế này để gỡ lỗi và kiểm tra dữ liệu trước khi xây dựng chính thành phần. Điều này thực sự tuyệt vời!
Ryan Hamblin

1
Để chuyển đổi sang thành phần: toddmotto.com/react-create-class-versus-component
whitneyland

11

' React-json-view ' cung cấp giải pháp kết xuất chuỗi json.

import ReactJson from 'react-json-view';
<ReactJson src={my_important_json} theme="monokai" />

5
const getJsonIndented = (obj) => JSON.stringify(newObj, null, 4).replace(/["{[,\}\]]/g, "")

const JSONDisplayer = ({children}) => (
    <div>
        <pre>{getJsonIndented(children)}</pre>
    </div>
)

Sau đó, bạn có thể dễ dàng sử dụng nó:

const Demo = (props) => {
   ....
   return <JSONDisplayer>{someObj}<JSONDisplayer>
}

0

Đây là một bản demo react_hooks_debug_print.htmltrong các câu trả lời dựa trên câu trả lời của Chris. Ví dụ về dữ liệu json là từ 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>

Hoặc theo cách sau, thêm kiểu vào tiêu đề:

    <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>

Và thay thế DebugPrintbằng những thứ sau:

const DebugPrint = () => {
  // /programming/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>
  )
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.