使用 JQ 解析 JSON 行以按顺序翻转键值

2024-03-29

我有一个包含 json 行的文件,需要根据每个 json 的抖动“alert.status”值的序列来验证其有效性。

有效 json 行的示例:

{"id":123,"code":"foo","severity":"Critical","severityCode":1, "property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}
{"id":456,"code":"bar","severity":"High","severityCode":2,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}
{"id":123,"code":"foo","severity":"Critical","severityCode":1,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"Off"}}
{"id":456,"code":"bar","severity":"High","severityCode":2,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"Off"}}
{"id":123,"code":"foo","severity":"Critical","severityCode":1,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}
{"id":456,"code":"bar","severity":"High","severityCode":2,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}

上面的文件是有效的,因为重复的 json(第 1,5 行和第 2,6 行)的状态在“on”、“off”、“on”等之间变化。

无效 json 行的示例:

{"id":123,"code":"foo","severity":"Critical","severityCode":1, "property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}
{"id":456,"code":"bar","severity":"High","severityCode":2,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}
{"id":123,"code":"foo","severity":"Critical","severityCode":1,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"On"}}
{"id":456,"code":"bar","severity":"High","severityCode":2,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"Off"}}
{"id":123,"code":"foo","severity":"Critical","severityCode":1,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"Off"}}
{"id":456,"code":"bar","severity":"High","severityCode":2,"property":{ "priority":"top", "owner":"dev"}, "alert":{"mgmt":"yes", "status":"Off"}}

上面的内容是无效的,因为第 1 行和第 3 行中的 json 是重复的,其“状态”值保持不变,而不会在打开或关闭时抖动。

我尝试使用 jq 将 json 行读入 json 数组

jq --slurp 'map(select(. >= 2))' jsonfile > jsonarray

但由于每行中的顺序很重要,我认为我不能使用 group_by 来查找重复项(group_by 的结果已排序)。

我正在考虑在每个 json 中插入一个带有增量编号的新键,因此在使用 group_by 之后,我们可以根据这个新键对结果进行排序以获取序列。

jq 有没有办法使用除两个键之外的所有键进行分组? (在本例中为“状态”和带有增量编号的新密钥)。

有没有更好的方法来解决这个问题?

非常感谢你的帮助!


我不认为我可以使用 group_by 来查找重复项(group_by 的结果已排序)。

没错,但是定义一个非排序的“group_by”非常容易,正如我们将看到的,它也可以轻松地用于按除特别指定的键之外的所有键进行排序。

组_BY

首先,这是一个简单的过滤器,它保留每个组中项目的原始顺序:

# The filter, f, must produce a string for each item in `stream`
def GROUPS_BY(stream; f):
  reduce stream as $x ({}; .[$x|f] += [$x] ) | .[] ;

名称中的“S”强调该函数是面向流的,首先是因为第一个参数是流,其次是因为该函数生成组流;该名称是大写的,以强调与现有内置函数的差异。

Example

为了说明如何使用它来按除特定键之外的所有键进行分组,请考虑以下示例(取自另一个 SO 问题):

def data:
  [{"foo":1,"bar":"a","baz":"whatever"},
   {"foo":1,"bar":"a","baz":"hello"},
   {"foo":1,"bar":"b","baz":"world"}] ;

GROUPS_BY(data[]; del(.baz) | tostring)

Output

[{"foo":1,"bar":"a","baz":"whatever"},{"foo":1,"bar":"a","baz":"hello"}]
[{"foo":1,"bar":"b","baz":"world"}]

细化

可能有人会反对要求 f 始终为字符串值会带来一些潜在的困难,因此这里有一个有效但更通用的定义:

# Emit a stream of the groups defined by f, without using sort.
# f need not be string-valued.
def GROUPS_BY(stream; f): 
   reduce stream as $x ({};
     ($x|f) as $s
     | ($s|type) as $t
     | (if $t == "string" then $s else ($s|tojson) end) as $y
     | .[$t][$y] += [$x] )
   | .[][]
   ;

现在我们可以简单地写:

GROUPS_BY(data[]; del(.baz))

与 JSON-Lines 文件一起使用

最简单的使用方法GROUPS_BY带有 JSON-Lines 文件的是inputs,例如假设使用更通用的 def,你可以这样写:

GROUPS_BY(inputs; del(.alert))

使用时不要忘记使用 -n 选项调用 jqinputs.

确定有效性的过滤器

根据我对问题的理解,可以使用以下过滤器来确定组的有效性:

def changing(f):
  def c:
    if length <= 1 then true
    elif (.[0] | f) == (.[1] | f) then false
    else .[1:] | c
    end;
  c ;

(这里使用内部函数c,是为了高效递归。当然,如果计算f冗余是一个问题,那么应该使用变体定义。)

Solution

总而言之,使用 GROUPS_BY 的更通用的定义, 假设我们希望识别无效组,解决方案似乎是两行:

GROUPS_BY(inputs; del(.alert))
| select( changing(.alert.status) | not )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JQ 解析 JSON 行以按顺序翻转键值 的相关文章

  • java.lang.String 无法转换为 org.json.simple.JSONObject simple-json

    我在尝试使用 google 的 simple json 解析简单的 json 时遇到奇怪的问题 这是我的代码 它不起作用 String s args 0 toString JSONObject json JSONObject new JSO
  • JSON 响应周围的注释块

    我注意到一些 Web 应用程序返回 AJAX 响应 并在注释块中嵌入 JSON 数据 例如 这是一个示例响应 firstName John lastName Smith address streetAddress 21 2nd Street
  • $.each([集合]) 与 $([集合]).each()

    两种方法似乎产生相同的结果 http jsbin com owedo 但我一直很难真正说服人们第二种方法有效 因为它显然并不为人所知 Create some data var foo vals id foo id bar Common Me
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 如何将JSON字符串映射到C#方法的调用

    我想实现一个框架来将 JSON 字符串映射到 C 方法的调用 例如 我有一个 C 类计算器 定义如下 C class class Calculator public int add int x int y int sub int x int
  • 使用 jquery 迭代 JSON 对象

    为什么以下不起作用 在循环内 当 myJSON 为空或不为空时 它永远不会打印 url each parseJSON myJSON function key value alert value url 对于这个 JSON 结构 host f
  • C# 中的 JSON 到 XML 转换

    我一直在使用 Json Net 将 JSON 解析为对象并转换为 XMLDocument 但我得到了 InvalidOperationException 该文档已经有一个 文档元素 节点 我有这个 JSON 数据 data name Ero
  • C# JSON 反序列化:类型是接口或抽象类,无法实例化

    我正在使用这个 C 项目 它使用用于与在线交易平台 Poloniex 进行通信的 API https github com Jojatekok PoloniexApi Net 此代码应该获取钱包中的余额 var x await polo c
  • 从 json 创建下拉列表

    我有一个这种形式的 json COLUMNS ID Name DATA 1 Joe 2 Sam 3 Doug 我正在寻找一个如何在 javascript 中从该数据创建下拉列表的示例 但 json dropdown 列表的所有示例 json
  • 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 崩溃

    好的 我正在运行一个公共 JSONP API 数据由我的 PHP 服务器提供 我刚刚读了这篇文章 JSON 不是的 JavaScript 子集 作者 Magnus Holm 2011 年 5 月 http timelessrepo com
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • 有没有办法将 JSON 模式转换为 XSD? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在寻找一种将 JSON 架构转换为 XSD 或 XML 架构的方法 我没有找到任何关于这个主题
  • 如何使用 try.zorba.io 从 JSON 运行 JSONiq

    我需要编写一个 JSONiq 表达式 仅列出成本至少为 3 的产品的名称 这是我在XQuery部分 supermarket visit date 08032019 bought item type confectionary item na
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • Swift 4 使用随机密钥解码嵌套 JSON [重复]

    这个问题在这里已经有答案了 我是 Swift 4 的新手 正在尝试从 Wikipedia API 解码此 JSON 我正在努力定义一个结构 因为我发现的所有示例 教程都仅嵌套 1 2 层深度 除此之外 当其中一个密钥是随机的时 如何解码数据
  • 在 JSON 对象中强制执行非空字段

    我们的 REST API 接收一些 JSON 对象输入 其中某些字段要求不为空 这些可以是字符串 整数 甚至可以是其他一些类实例作为参考 我们正在尝试找到一种方法来强制这些字段不为空 而不是在 API 中进行空检查的正确方法 当前的 if
  • 如何使用 JSON.net 引用外部文件?

    这是当 JSON net 尝试读取我的 JSON 架构时出现的错误 return JsonSchema Read new JsonTextReader reader 2014 07 15 15 33 42 7011 Fatal Newton
  • 如何 json_normalize() df 中的特定字段并保留其他列? [复制]

    这个问题在这里已经有答案了 这是我的简单示例 我的实际数据集中的 json 字段非常嵌套 因此我一次解压一层 我需要在 json normalize 之后保留数据集上的某些列 https pandas pydata org docs ref
  • 一起使用 Argparse 和 Json

    我是 Python 初学者 我想知道 Argparse 和 JSON 是否可以一起使用 说 我有变量p q r 我可以将它们添加到 argparse 中 parser add argument p param1 help x variabl
  • 在 php 中回显 JSON 数据

    我正在尝试回显一些 JSON 数据 问题是数据包含变量 但我的代码没有将变量放入字符串中 这是我的代码 status row Status priority row Priority echo status status priority

随机推荐