【问题标题】:Converting JSON pretty print to one line将 JSON 漂亮打印转换为一行
【发布时间】:2017-01-31 13:45:40
【问题描述】:

我有一个我运行的命令,它给出如下输出:

{
"endpointApplications": {
    "App_Name": {
        "connectionState": "Disconnected",
        "connectionTime": "No connection was established",
        "linkAttributes": {
            "ackSettings": {
                "dataAckEnabled": "true",
                "dataAckTimeout": "5000",
                "dataNakRetryLimit": "0",
                "retransmitDelay": "500"
            },
            "keepAliveSettings": {
                "keepAliveAckTimeout": "5000",
                "keepAliveInterval": "30000"
            },
            "logTraffic": "false",
            "port": "9999",
            "role": "server"
        },
        "protocol": "snmp"
    }
},
"queueStats": {}
}

我需要将输出放在一行中,如下所示:

{"endpointApplications": {"app_name": {"connectionState": "Disconnected","connectionTime": "No connection was established","linkAttributes": {"ackSettings":{"dataAckEnabled": "true","dataAckTimeout": "5000","dataNakRetryLimit": "0","retransmitDelay": "500"},"keepAliveSettings":{"keepAliveAckTimeout": "5000","keepAliveInterval": "30000"},"logTraffic": "false","port": "9999","role": "server"},"protocol": "snmp"}},"queueStats":{}}

我尝试使用 awk 和 sed 组合不同的参数,但我无法在不丢失 JSON 格式的情况下开始工作。

【问题讨论】:

  • 考虑使用jq 来处理您似乎试图对每个结果行执行的操作:)

标签: json linux bash awk sed


【解决方案1】:

你应该使用jq 来处理类似的事情:

jq -c . input.txt

另一种快速而肮脏的解决方案是使用sed & tr

sed -e 's/^ *//' < input.txt | tr -d '\n'

虽然我建议使用专为处理 JSON 而设计的jqjq 就像 JSON 的 sed。使用 sed/awk/etc 以文本方式操作 JSON 并不能保证生成语义上等效的 JSON。

【讨论】:

  • 在Debian风格的Linux(如Ubuntu)下,通过简单的sudo apt-get install jq即可获取jq
【解决方案2】:

jq 或任何其他 json 感知工具最适合 json 文件操作。但是这里是基于 awk 的解决方案。

awk -v RS= '{$1=$1}1' input.json
{ "endpointApplications": { "App_Name": { "connectionState": "Disconnected", "connectionTime": "No connection was established", "linkAttributes": { "ackSettings": { "dataAckEnabled": "true", "dataAckTimeout": "5000", "dataNakRetryLimit": "0", "retransmitDelay": "500" }, "keepAliveSettings": { "keepAliveAckTimeout": "5000", "keepAliveInterval": "30000" }, "logTraffic": "false", "port": "9999", "role": "server" }, "protocol": "snmp" } }, "queueStats": {} }

注意:这个解决方案主要是针对没有像jq这样的工具并且由于某些原因没有机会安装它们的遗留系统。

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 2014-05-19
    • 2013-01-09
    • 2021-01-31
    • 2014-05-12
    • 2019-12-11
    • 2017-11-03
    相关资源
    最近更新 更多