【问题标题】:Incorrect results from json2html modulejson2html 模块的结果不正确
【发布时间】:2021-11-14 23:42:45
【问题描述】:

我在网上看到了很多这样的例子,但我没有找到任何可以帮助我解决我面临的问题的东西。我正在尝试将 JSON 对象转换为 HTML 表,但遇到了几个问题。

假设我有以下对象,称之为tableJson,它本质上代表一个只有列标题的表:

[
  {
    "firstColumn": []
  },
  {
    "secondColumn": []
  },
  {
    "thirdColumn": []
  }
]

在尝试将其转换为 HTML 表格时,我执行了以下操作:

jsonDumps = json.dumps(jsonTable)
htmlTable = json2html.convert(json = jsonDumps)

看起来很简单。但是,htmlTable 的结果给了我两个问题:

  1. 输出采用项目符号列表格式
  2. 每个列标题都被视为一个单独的表格

比如上面htmlTable的结果是:

<ul>
  <li>
    <table border="1">
      <tr><th>firstColumn</th><td></td></tr>
    </table>
  </li>
  <li>
    <table border="1">
      <tr><th>secondColumn</th><td></td></tr>
    </table>
  </li>
  <li>
    <table border="1">
      <tr><th>thirdColumn</th><td></td></tr>
    </table>
  </li>
</ul>

什么是(正确)创建表的简单方法,以便我没有将它放在项目符号列表中,并且每列都被视为正确的列而不是表?

JSON 对象的表示方式有问题吗?如果是这样,正确的语法是什么,以便json2html 将其正确转换为表格?

【问题讨论】:

  • 结果表应该是什么?您可能会发现 Pandas DataFrame 的 .to_html() method 非常适合您,并提供了一个更好的机会来尽早处理数据
  • 我想我的想法应该只是一个普通的 HTML 表格。例如,类似于&lt;table&gt; &lt;tr&gt; &lt;td&gt;firstRow&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;secondRow&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;thridRow&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt;

标签: python html json html-table json2html


【解决方案1】:

如果您的表格,原始结构存在一些问题,当您尝试从中创建 DataFrame 时会更加清晰;如果您首先将其重组为单个 dict,您可能会发现它更容易使用并且可以直接使用 Pandas 来呈现您的表格

起始值

>>> import pandas as pd
>>> src_table = [
...   {
...     "firstColumn": []
...   },
...   {
...     "secondColumn": []
...   },
...   {
...     "thirdColumn": []
...   }
... ]

问题演示

(每一列都是唯一的,而不是在同一个集合中)

>>> pd.DataFrame(src_table)
  firstColumn secondColumn thirdColumn
0          []          NaN         NaN
1         NaN           []         NaN
2         NaN          NaN          []

字典和显示的扁平化列表

How do I merge a list of dicts into a single dict?

>>> src_flattened = dict(pair for d in src_table for pair in d.items())
>>> src_flattened
{'firstColumn': [], 'secondColumn': [], 'thirdColumn': []}
>>> df = pd.DataFrame(src_flattened)
>>> df
Empty DataFrame
Columns: [firstColumn, secondColumn, thirdColumn]
Index: []
>>> print(df.to_html())
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>firstColumn</th>
      <th>secondColumn</th>
      <th>thirdColumn</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>

渲染

插入一些值

>>> pd.DataFrame({"col1": [1,2,3], "col2": [4,5,6], "col3": ['a', None, False]}).to_html()
'<table border="1" class="dataframe">\n  <thead>\n    <tr style="text-align: right;">\n      <th></th>\n      <th>col1</th>\n      <th>col2</th>\n      <th>col3</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>4</td>\n      <td>a</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>5</td>\n      <td>None</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>6</td>\n      <td>False</td>\n    </tr>\n  </tbody>\n</table>'

渲染

您可以对 .to_html() method 使用不同的参数来省略主要的表格功能,例如索引,并在 CSS 中完成其余的工作

【讨论】:

  • 非常感谢您!如果 JSON 对象中有行,那么正确的语法是什么?例如,如果我要在每一列下添加一行,src_table 应该是什么样子?
  • @Adam:在每列下添加一行是什么意思?
  • @martineau 抱歉,我的意思是添加新行(类似于此答案中的示例)
  • @ti7 出于某种原因,我输出的表格在每个填充的列之间都有一个空白列。知道为什么会这样吗?
  • @Adam .. 嗯,这可能是一个很好的第二个问题! ..但它可能只是造型吗?我希望初始输入完全是一个列表字典,其中每个键是列名,每个列表是数据的集合.. 如果不是这样,你可以按摩它(filter(None, iterable)可能有助于删除空值).. 如果您的数据对您来说“错误”方向,您也可以使用 .T 获得转置视图(对角折叠)pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2020-10-14
  • 1970-01-01
  • 2014-06-19
  • 2019-09-21
  • 2013-03-04
相关资源
最近更新 更多