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