用 JQ 去除一层对象嵌套

Posted

技术标签:

【中文标题】用 JQ 去除一层对象嵌套【英文标题】:removing one layer of object nesting with JQ 【发布时间】:2018-06-20 14:23:33 【问题描述】:

我一直在修补 JQ 以尝试操纵一些数据。到目前为止,使用我的命令输出以下 JSON:

 map(Row: .[] )
|   map(select(.Row.ganjalord.latitude | test("SOME_TESTING_CONDITION")?))

输入:

[
  
    "Row": 
      "ganjalord": 
        "latitude": "56.237480",
        "temp": 44
      
    ,
    "fighter": "1"
  ,
  
    "Row": 
      "ganjalord": 
        "latitude": "53.237480",
        "temp": 42
      
    ,
    "fighter": "0"
  
]

如何实现不按行嵌套的示例输出?

样本输出:

[
  
    "ganjalord": 
      "latitude": "56.237480",
      "temp": 44
    ,
    "fighter": "1"
  ,
  
    "ganjalord": 
      "latitude": "53.237480",
      "temp": 42
    ,
    "fighter": "0"
  
]

我是否使用简单的选择语句来尝试实现这一目标?

【问题讨论】:

How to create a Minimal, Complete, and Verifiable example 感谢您让我注意到这一点,@glennjackman 我已经更新了 q。 您需要包含 input 以便其他人可以重现该问题。 更新为输入。 @格伦杰克曼 顺便说一句,您在这里尝试做的事情与 OP 在最近的另一个问题***.com/questions/50937290/… 中尝试做的事情非常相似。 【参考方案1】:

* 运算符,给定两个字典,合并它们的内容。因此,

jq '[.[] | (. * .Row) | del(.Row)]'

...在给定输入时作为输出发出:

[
  
    "fighter": "1",
    "ganjalord": 
      "latitude": "56.237480",
      "temp": 44
    
  ,
  
    "fighter": "0",
    "ganjalord": 
      "latitude": "53.237480",
      "temp": 42
    
  
]

【讨论】:

不管怎样,第一对括号似乎不是必需的 不过,我认为代码的可读性更高。【参考方案2】:

如图所示将以下过滤器应用于“输入”,会产生所需的结果:

map( with_entries( if .key == "Row" then .value|to_entries[] else . end) )

理解这一点的关键是with_entries首先应用to_entries产生键/值对,然后应用from_entries

当然,与基于. * .Row. * Row(或.+.Row.Row+.)的解决方案一样,如果任何提升的键名与顶部重合,上述解决方案将导致一些数据丢失级键名。

【讨论】:

以上是关于用 JQ 去除一层对象嵌套的主要内容,如果未能解决你的问题,请参考以下文章

jq ~ 有没有更好的方法来折叠单个对象数组?

PhotoShop去除脸部油光

java-ArrayList中去重复字符串或重复对象LinkedList集合泛型增强for静态导入可变参数asList()方法集合嵌套

Jq基础简介

关于如何去除数组中重复项

oracle用rowid去掉重复值