使用唯一标识符访问json对象中的字段

时间:2016-09-09 16:49:24

标签: json jq

我无法理解jq。我甚至无法阐明我想要学习的东西。

我想我想要一张外卡?我的愿望是,给出一个像这样的json片段:

d.TrimEnd(new char[]{'|'});

计算某种类型出现的次数,或者甚至只将所有类型输出到文件中。

这完全不起作用(在简化的例子中没有意义):

{
  "logs": {
    "-MnpQaRONGXz9tff-W": {
      "points": 10,
      "type": "signup"
    },
    "-N5qlX1mQ3SYA9RXdE": {
      "points": 15,
      "type": "welcome"
    },
    "-N5rx8PAcNgWu25zRf": {
      "points": 5,
      "type": "vote"
    },
    "-N5s29TyZ33snUqC5X": {
      "points": 5,
      "type": "vote"
    }
  },
  "total": 35
}

会给我一个简单的对象或类型列表。

3 个答案:

答案 0 :(得分:1)

不是jq - 仅答案,但您可以获取所有type字段的列表,然后通过uniq -c管道以获取计数。

$ jq '.logs[] | .type' tmp.json | uniq -c
    1 signup
    1 welcome
    2 vote

答案 1 :(得分:1)

获取所有对象的所有“类型”值的流,无论嵌套有多深:

 .. | select(.type?) | .type

在您的特定情况下,以下内容就足够了:

.[] | select(type == "object") | .[].type

制作制表:

def tabulate: reduce .[] as $i ({}; .[$i] += 1 );

[.[] | select(type == "object") | .[].type] | tabulate

根据您的输入,输出将是: { "signup": 1, "welcome": 1, "vote": 2 }

答案 2 :(得分:1)

以下是使用 tostream 减少

的解决方案
reduce (tostream|select(length==2)) as [$p,$v] (
  {}
; if $p[-1] == "type" then .[$v] += 1 else . end  
)

带样本数据的输出

{
  "signup": 1,
  "welcome": 1,
  "vote": 2
}