如何在 React 中将 JSON 数据显示为表格

Posted

技术标签:

【中文标题】如何在 React 中将 JSON 数据显示为表格【英文标题】:How to display JSON data inside render as table in React 【发布时间】:2020-05-24 12:48:31 【问题描述】:

我正在使用返回各种不同键值对的 JSON 的 API。我试图在render() 中将它们显示为一个包含 2 列键和值的表,其中分别包含对象键和值。

    fetchBasicDetails() 中的 API 是 POST,它将默认 this.state 值作为输入并返回 JSON 输出。 然后使用 setState 方法将 JSON 输出对象存储到 this.state 的 birth_details 属性中。 然后,我尝试使用forEach 和Object.keys 显示<table> 标记中的对象数据,结果什么也没显示。

感谢任何帮助。谢谢。

export default class HoroscopeReport extends React.Component 
  constructor(props) 
    super(props);

    this.state = 
      day: 11,
      month: 2,
      year: 2019,
      hours: 12,
      minutes: 59,
      tzone: 5.5,
      lat: 19.22,
      lon: 25.2,
      birth_details:
    ;
  

  handleSubmit = event => 
    event.preventDefault();
    //console.log("Received user submitted data"+JSON.stringify(this.state))
    this.fetchBasicDetails();
  ;

  fetchBasicDetails() 
        let myHeaders = new Headers();
        myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
        myHeaders.append("Authorization", "Basic XXXXXXXXXXXXXXX");

        let urlencoded = new URLSearchParams();
        urlencoded.append("day", this.state.day);
        urlencoded.append("month", this.state.month);
        urlencoded.append("year", this.state.year);
        urlencoded.append("hour", this.state.hours);
        urlencoded.append("min", this.state.minutes);
        urlencoded.append("lat", this.state.lat);
        urlencoded.append("lon", this.state.lon);
        urlencoded.append("tzone", this.state.tzone);

        let requestOptions = 
          method: 'POST',
          headers: myHeaders,
          body: urlencoded,
          redirect: 'follow'
        ;

        fetch("https://json.astrologyapi.com/v1/birth_details", requestOptions)
          .then(response => response.text())
          .then(result => 
            this.setState( birth_details: result );
          )
          .catch(error => console.log('error', error));
       

  render() 

    return (
      <div>
/* FORM SUBMITTION CODE HERE */
              <h2>Output:-</h2>
              <table border=2 cellPadding=5>
                <thead>
                  <tr>
                    <td>Key</td>
                    <td>Value</td>
                  </tr>
                </thead>
                <tbody>
                  Object.keys(this.birth_details).forEach(function (element) 
                  return <tr><td>element</td><td>this.birth_details[element]</td></tr>;
                  );
                </tbody>
              </table>
      </div>
    );
  

供参考,这是JSON的输出:-

"year":2019,"month":2,"day":11,"hour":12,"minute":59,"latitude":19.22,"longitude":25.2,"timezone":5.5,"gender":" ","name":" ","seconds":0,"ayanamsha":24.124044280610406,"sunrise":"10:19:50","sunset":"21:47:13"

【问题讨论】:

【参考方案1】:

通常在 React 中基于数组呈现元素是使用 map() 而不是 forEach() 处理的。原因是使用map(),您可以在迭代的同时操作每个元素,并为render 方法返回完全适合的JSX 语法。同时forEach()不返回任何东西,只返回undefined

我猜你可以尝试以下方法:

render() 
    return (
      <div>
        <h2>Output:-</h2>
        <table border=2 cellPadding=5>
           <thead>
              <tr>
                <td>Key</td>
                <td>Value</td>
              </tr>
           </thead>
           <tbody>
              
                  this.state.birth_details && 
                  Object.keys(this.state.birth_details).map(function (element) 
                     return <tr>
                       <td>element</td>
                       <td>this.state.birth_details[element]</td>
                     </tr>;
                  );
              
           </tbody>
        </table>
      </div>
    );

希望对你有帮助!

【讨论】:

糟糕,我没有注意到您发布了答案!我猜在移动设备上发帖的缺点:o) @cubrr 没问题,会发生这种情况。 :)【参考方案2】:

请记住,您需要在 JSX 中使用花括号来表示您要呈现值,而不是将代码原样呈现为文本。

您还需要使用map 而不是forEachmap 用于将数组转换为其他内容(我们获取字符串列表并将它们映射到 React 元素),而 forEach 用于仅对每个元素执行某些操作而不返回任何内容。

另外,您可能指的是this.state.birth_details 而不是this.birth_details>

<tbody>

  Object.keys(this.state.birth_details).map(function (element) 
    return (
      <tr key=element>
        <td>element</td>
        <td>this.state.birth_details[element]</td>
      </tr>
    );
  )

</tbody>

我还在返回的元素上设置了key。阅读有关 React here 中列表和键的更多信息。

【讨论】:

虽然这肯定有助于打印对象数据,但它是按字符打印的!也就是说,键值列中的输出类似于0 , 1 ", 2 y, 3 e, 4 a, 5 r @VaibhavDwivedi 在您进行提取的代码中,将response =&gt; response.text() 更改为response =&gt; response.json() 这会为您解析 JSON,因为目前您只是将 JSON 作为字符串而不是对象。

以上是关于如何在 React 中将 JSON 数据显示为表格的主要内容,如果未能解决你的问题,请参考以下文章

在 jQuery 中将 HTML 表格数据转换为 JSON 对象

reactjs中如何使用json在表格中显示数据?

使用 React JS 显示和修改 JSON 数据(显示在表格中)

如何在 Snowflake 中将 json 转换为表格格式

在 Django 中将 QuerySet 转换为 JSON

JS中将ajax请求返回json数据动态生成表格显示在div中