使用jq解析无效的JSON?

使用jq解析无效的JSON?

jq 可以解析这样无效的 JSON 吗?:

[2023.06.07-21.58.47] StatManagerLog: {
    "RoundState":
    {
        "State": "Starting",
        "Timestamp": "2023.06.07-21.58.47"
    }
}
[2023.06.07-21.58.47] StatManagerLog: {
    "RoundState":
    {
        "State": "StandBy",
        "Timestamp": "2023.06.07-21.58.47"
    }
}

理想情况下,每个 StatManagerLog 对象都将由 jq 读取。

似乎无法找出 jq 如何做到这一点。我尝试过使用-R,但后来我失去了执行 jq 的任何命令的能力。这可能吗,还是我需要先预处理文件才能使其有效 JSON?

答案1

我不是特别熟悉jq,不过,我希望这个答案会有用。

编写解析器(根据固定语法解析文件)通常是一项复杂而痛苦的任务。

编写一个可以纠正错误的解析器完全是另一个层面的事情。我什至无法想象它有多复杂!

考虑一下可以“纠正”您所显示的输入的不同方式。

也许这[2023.06.07-21.58.47]意味着代替,and .-即六个项目的数组[2023,06,07,21,58,47]......但是那么如何处理其余的呢?

也许整个都[2023.06.07-21.58.47] StatManagerLog:应该被丢弃?那么该文件就不是单个 JSON,而是几个串联的 JSON 文件;jq似乎能够应付的事情。

也许它的意思是"[2023.06.07-21.58.47] StatManagerLog":,即密钥周围缺少双引号,并且{ }封装整个文件的大外部对也丢失了。

我确信还有一些其他可能性,大约这个大小的修复可以使文件成为有效的 JSON。解析器不知道该选择哪一个。

这与口语类似。想想有多少次你没有清楚地听到整个句子并反问,因为你的大脑无法自动纠正未听到的部分......可能是因为你可以想象不止一种纠正句子的方法,它们会导致不同的结果意义。

长话短说:只有您知道数据需要如何修复,最初的意图是什么;解析器没有机会弄清楚它。在将其输入到 之前,请使用一些文本处理工具(sedawkcut等)修复它jq。或者修复发出此数据的人以发出正确的 JSON。

答案2

[通过简单地替换以a开头的每一行来预处理文件,{使其成为有效的 JSON,或者至少是也jq能够处理的有效 JSON 的串联:

$ sed 's/^\[.*/{/' file | jq -c .
{"RoundState":{"State":"Starting","Timestamp":"2023.06.07-21.58.47"}}
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}

我假设您不需要删除的信息,因为它包含已包含在输出中的数据(时间戳)和静态字符串 ( StatManagerLog)。

然后,您可以选择所需的条目,例如按州或时间戳:

$ sed 's/^\[.*/{/' file | jq -c --arg q 2023.06.07-21.58.47 'select(.RoundState.Timestamp == $q)'
{"RoundState":{"State":"Starting","Timestamp":"2023.06.07-21.58.47"}}
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}
$ sed 's/^\[.*/{/' file | jq -c --arg q StandBy 'select(.RoundState.State == $q)'
{"RoundState":{"State":"StandBy","Timestamp":"2023.06.07-21.58.47"}}

...或者通过对您需要的任何聚合进行更复杂的选择。

相关内容