检查特定JSON密钥的重复值

时间:2018-12-31 15:51:15

标签: json parsing duplicates jq

我在容器中存储了以下JSON记录

class WebsiteUser(HttpLocust):
    def setup(self):
        client = clients.HttpSession(base_url=self.host)
        client.post("/resources/", json=RESOURCE_1, headers=headers_with_auth)
    task_set = UserBehavior
    min_wait = 500
    max_wait = 900

我正在检查是否有memberId的任何重复-理想情况下返回true / false,然后还返回重复的值。

所需的输出:

    {"memberId":"123","city":"New York"}
    {"memberId":"234","city":"Chicago"}
    {"memberId":"345","city":"San Francisco"}
    {"memberId":"123","city":"New York"}
    {"memberId":"345","city":"San Francisco"}

1 个答案:

答案 0 :(得分:1)

这是使用inputs的有效方法。它需要使用-n命令行选项调用jq。这个想法是创建一个字典来保存每个memberId字符串值的计数。

可以如下创建字典:

reduce (inputs|.memberId|tostring) as $id ({}; .[$id] += 1)

因此,要生成一个真/假指示符,如果有重复项,则跟着重复项,您可以编写:

reduce (inputs|.memberId|tostring) as $id ({}; .[$id] += 1)
| to_entries
| map(select(.value > 1))
| (length > 0), .[].key

(如果已知所有.memberId值都是字符串,那么当然可以放弃对tostring的调用。相反,如果.memberId既是字符串又是整数值,则上述程序将不会t区分1"1"的出现。)

上述字典有时被称为“单词袋”(https://en.wikipedia.org/wiki/Bag-of-words_model)。这导致了通用功能:

def bow(stream): 
  reduce stream as $word ({}; .[($word|tostring)] += 1);

现在可以更加简洁地编写解决方案:

bow(inputs.memberId)
| to_entries
| map(select(.value > 1))
| (length > 0), .[].key

对于只有重复的值,可以编写更有效的查询:

bow(inputs.memberId)
| keys_unsorted[] as $k
| select(.[$k] > 1)
| $k