使用jq实现JSON到HTML的转换

使用jq实现JSON到HTML的转换,html,json,linux,jq,nested-lists,Html,Json,Linux,Jq,Nested Lists,我有一个以下格式的JSON,我想用它创建一个给定格式的HTML文件。不幸的是,由于一些限制,我只能使用“jq”来实现这一点。我对shell脚本的世界还不熟悉,这个脚本真的让我很烦。对齐等不重要,表格应以所需格式填充 [ { "key1" : "value1", "key2" : "value2", "key3" : "value3", &qu

我有一个以下格式的JSON,我想用它创建一个给定格式的HTML文件。不幸的是,由于一些限制,我只能使用“jq”来实现这一点。我对shell脚本的世界还不熟悉,这个脚本真的让我很烦。对齐等不重要,表格应以所需格式填充

[
  {
    "key1" : "value1",
    "key2" : "value2",
    "key3" : "value3",
    "key4":[
      {
        "key5" : "value5",
        "key6" : "value6"
      },
      {
        "key5" : "value7",
        "key6" : "value8"
      }
      ]
  },
  {
    "key1" : "value11",
    "key2" : "value12",
    "key3" : "value13",
    "key4":[
      {
        "key5" : "value15",
        "key6" : "value16"
      },
      {
        "key5" : "value17",
        "key6" : "value18"
      }
      ]
  }
]

JSON摘要

key1 key2 key3 价值1 价值2 价值3 价值11 价值12 价值13 价值详情1

key5 key6 价值5 价值6 价值7 价值8 价值详情11

key5 key6 价值15 价值16 价值17 价值18
这是一个以一些通用的JSON-to-html过滤器开始的肉土豆解决方案:

一些通用的html过滤器 手头的任务 输出: JSON摘要

key1key2key3 值1值2值3 值11值12值13 价值详情1

key5key6 价值5价值6 价值7价值8 价值详情11

key5key6 价值15价值16 价值17价值18
也许检查一下,你可以用JS轻松生成

关于输入,顶级记录是否始终具有相同的键?辅助记录是否始终具有彼此相同的字段?辅助记录是否始终仅位于一个顶级记录下,或者是否位于多个顶级记录下?最后一个问题:它真的只能使用jq吗?或者它可以使用shell脚本(如果是,是哪一个)或者其他“标准”实用程序(例如perl、awk、sed)?@JoeCasadonte在key4中我们只有2个json对象,但实际上它可能是动态的,但它们只有key5和key6。类似地,在主json数组中,我只给出了2个对象,但由于它是一个数组,因此大小可能是动态的,尽管键始终保持不变。关于使用其他实用程序,不幸的是,我不能使用jq以外的任何东西。希望这能有所帮助。恐怕我不知道如何在jq中打印这样的结构化输出——我希望jq调用周围至少有一个shell脚本包装器。我相信这可以用jq来完成,将字符串连接在一起,非常恶心,但我没有研究过如何做这样的事情,因为我从来没有过这样严格的限制。
<p>Summary of JSON</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr>
<td style="text-align: center;"><strong>key1</strong></td>
<td style="text-align: center;"><strong>key2</strong></td>
<td style="text-align: center;"><strong>key3</strong></td>
</tr>
<tr>
<td >value1</td>
<td >value2</td>
<td >value3</td>
</tr>
<tr>
<td >value11</td>
<td >value12</td>
<td >value13</td>
</tr>
</tbody>
</table>
<p>Details of value1</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr>
<td style="text-align: center;"><strong>key5</strong></td>
<td style="text-align: center;"><strong>key6</strong></td>
</tr>
<tr>
<td>value5</td>
<td>value6</td>
</tr>
<tr>
<td>value7</td>
<td>value8</td>
</tr>
</tbody>
</table>
<p>Details of value11</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr>
<td style="text-align: center;"><strong>key5</strong></td>
<td style="text-align: center;"><strong>key6</strong></td>
</tr>
<tr>
<td>value15</td>
<td>value16</td>
</tr>
<tr>
<td>value17</td>
<td>value18</td>
</tr>
</tbody>
</table>
def p($p): "<p>\($p)</p>";

# input: array of arrays
def row2html:
  reduce .[] as $value ("<tr>"; . + "<td>\($value)</td>") + "</tr>";

# with style
def row2html($style):
  reduce .[] as $value ("<tr>";
     . + "<td style=\($style)><strong>\($value)</strong></td>") + "</tr>";

# input: an array of arrays, the first being treated as a header row
def table2html($tablestyle; $headerstyle):
  "<table style=\($tablestyle)>",
  "<tbody>",
   (.[0] | row2html($headerstyle)),
   (.[1:][] | row2html),
  "</tbody>",
  "</table>" ;

# Input: an array of conformal objects
# Output: header array followed by arrays of values
def atomicKeys2arrays:
  # emit an array of atomic keys
  def atomicKeys: to_entries | map( select(.value|scalars) | .key);
  (.[0] | atomicKeys) as $keys
  | $keys,
    (.[] | [ .[$keys[]]]);
def tableStyle: "\"border-collapse: collapse; width: 100%;\" border=\"1\"" ;
def headerStyle: "\"text-align: center;\"" ;

def table2html: table2html(tableStyle; headerStyle);

def task:
  p("Summary of JSON"),
  ( [atomicKeys2arrays]|table2html ),
  p("Details of value1"),
  ([.[0].key4 | atomicKeys2arrays] | table2html ), 
  p("Details of value11"),
  ([.[1].key4 | atomicKeys2arrays] | table2html ) ;

task
<p>Summary of JSON</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr><td style="text-align: center;"><strong>key1</strong></td><td style="text-align: center;"><strong>key2</strong></td><td style="text-align: center;"><strong>key3</strong></td></tr>
<tr><td>value1</td><td>value2</td><td>value3</td></tr>
<tr><td>value11</td><td>value12</td><td>value13</td></tr>
</tbody>
</table>
<p>Details of value1</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr><td style="text-align: center;"><strong>key5</strong></td><td style="text-align: center;"><strong>key6</strong></td></tr>
<tr><td>value5</td><td>value6</td></tr>
<tr><td>value7</td><td>value8</td></tr>
</tbody>
</table>
<p>Details of value11</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr><td style="text-align: center;"><strong>key5</strong></td><td style="text-align: center;"><strong>key6</strong></td></tr>
<tr><td>value15</td><td>value16</td></tr>
<tr><td>value17</td><td>value18</td></tr>
</tbody>
</table>