使用JQ

时间:2018-08-21 16:35:15

标签: json bash curl jq jive

目标

我的目标是使用Jive API和cURL命令将HTML内容推送到Jive内容管理平台。

当前状态

我可以成功完成此操作,但是我的过程是手动的。我想通过脚本编写将HTML插入JSON文件的脚本来进一步实现自动化,Jive需要通过API发布HTML内容。

JSON文件示例

{
    "entityType": "document",
    "content": {
        "type": "text/html",
        "text": "ENCODED HTML FILE CONTENT AS A STRING"
    },
    "type": "document",
    "subject": "Document Title",
    "visibility": "place",
    "parent": "https://<URL>/api/core/v3/places/1579"
}

HTML文件示例

<html lang="en">
<body>
<h1 id="example">Sample file</h1>
    <p>Sample text</p>
<table>
    <thead>
        <tr class="header">

etc.

cURL示例

curl -X PUT -u username:password -H "Content-Type: application/json" -H "Accept: application/json" -H "Cache-Control: no-cache" -d @file.json "https://<URL>/api/core/v3/contents/12204"

Jive API does not turn a standalone .html file sent over the API into HTML content而是将其视为任何上传的二进制文件,必须由用户下载。

尝试解决

similar question in Stack Overflow询问是否以相同方式插入.txt文件。接受的答案表明我尝试:

jq --slurpfile text file.html '.text=$text' file.json >newfile.json

我曾尝试用引号将文件括起来(在编码和字符串化之后),但这也失败了。

为什么要使用cURL和JQ

我正在寻找JQ + cURL解决方案的原因是JQ和cURL都可以使用Bash脚本运行,这是我所知道的唯一编程。

奖金问题

要使HTML文件成为编码的字符串,我运行sed 's/&/\&amp;/g; s/"/\\\"/g; s/'"'"'/\\\'"'"'/g'并删除所有硬性返回。我相信JQ的原始输入和混音选项可以通过类似jq -Rs '{ text: . }' file.html的方式(根据此Stack overflow question来解决此问题,JQ提供了一种@json的转义HTML的方法,但是在许多Web搜索和尝试之后我都失败了,最好运行一个JQ命令来对HTML 进行编码/字符串化,然后将HTML插入.json文件。

如果这完全是错误的方法...

此问题中描述的解决方案是我解决问题的尝试,并且我希望我的基本假设和方法是否不如其他可能的方法逊色。

谢谢。

2 个答案:

答案 0 :(得分:3)

如果您的HTML文件足够短,则可以放在命令行中:

jq --arg text "$(<file.html)" '.content.text=$text' file.json >newfile.json

或者,运行jq的额外副本,但使用任何大小的文件:

jq --slurpfile texts <(jq -Rs file.html) '.content.text=$texts[0]' file.json >newfile.json

答案 1 :(得分:2)

关于编码HTML文件的“奖励问题”,您可以简单地使用过滤器@html,例如

.content.text=($text | @html)

在线手册中:

  

@html:

     

通过将字符<>&'“映射到它们的字符来应用HTML / XML转义   实体等价物<,>,&,',“。