【问题标题】:How can i delete a section of Json when a pattern occurs发生模式时如何删除 Json 的一部分
【发布时间】:2021-02-09 04:38:50
【问题描述】:

我正在使用 API 来检索一些足球数据,我注意到当某种模式发生时,数据已损坏。

以下是正确数据格式的示例:

 {
    "id": 150,
    "name": "bwin",
    "odds": {
      "data": [
        {
          "value": "15.50",
          "handicap": null,
          "total": null,
          "label": "1",
          "probability": "6.45%",
          "dp3": "15.500",
          "american": 1450,
          "factional": null,
          "winning": false,
          "stop": false,
          "bookmaker_event_id": null,
          "last_update": {
            "date": "2019-11-29 16:02:57.421588",
            "timezone_type": 3,
            "timezone": "UTC"
          }
        },
        {
          "value": "7.50",
          "handicap": null,
          "total": null,
          "label": "X",
          "probability": "13.33%",
          "dp3": "7.500",
          "american": 650,
          "factional": null,
          "winning": false,
          "stop": false,
          "bookmaker_event_id": null,
          "last_update": {
            "date": "2019-11-29 16:02:57.421630",
            "timezone_type": 3,
            "timezone": "UTC"
          }
        },
        {
          "value": "1.10",
          "handicap": null,
          "total": null,
          "label": "2",
          "probability": "90.91%",
          "dp3": "1.100",
          "american": -1000,
          "factional": null,
          "winning": true,
          "stop": false,
          "bookmaker_event_id": null,
          "last_update": {
            "date": "2019-11-29 16:02:57.421656",
            "timezone_type": 3,
            "timezone": "UTC"
          }
        }
      ]
    }
  },

如您所见,每个块都以以下顺序开始: 值、差点、总计、标签。

但是,有时数据已损坏,我在响应中发现了一种模式,我可以使用它来知道数据已损坏,每个小部分始终以标签和值开头:

 {
        "id": 3,
        "name": "188Bet",
        "odds": {
          "data": [
            {
              "label": "1",
              "value": "1.04",
              "probability": "96.15%",
              "dp3": "1.040",
              "american": -2500,
              "factional": null,
              "winning": false,
              "handicap": null,
              "total": null,
              "bookmaker_event_id": null,
              "last_update": {
                "date": "2019-11-29 16:35:31.000000",
                "timezone_type": 3,
                "timezone": "UTC"
              }
            },
            {
              "label": "X",
              "value": "9.50",
              "probability": "10.53%",
              "dp3": "9.500",
              "american": 850,
              "factional": null,
              "winning": false,
              "handicap": null,
              "total": null,
              "bookmaker_event_id": null,
              "last_update": {
                "date": "2019-11-29 16:35:31.000000",
                "timezone_type": 3,
                "timezone": "UTC"
              }
            },
            {
              "label": "2",
              "value": "18.00",
              "probability": "5.56%",
              "dp3": "18.000",
              "american": 1700,
              "factional": null,
              "winning": true,
              "handicap": null,
              "total": null,
              "bookmaker_event_id": null,
              "last_update": {
                "date": "2019-11-29 16:35:31.000000",
                "timezone_type": 3,
                "timezone": "UTC"
              }
            }
          ]
        }
      },

问题是我的 API 响应一次包含 100 个上述片段,是否可以使用 JQ / sed 或任何其他 shell 工具来删除包含损坏模式的 json 片段?如果是这样,我怎样才能做到这一点?

我一直在尝试删除损坏的数据,但是我可以实现它的唯一方法是将数据拆分为每个文件的一个段,然后删除包含损坏模式的文件,但我想知道是否有更快的方法。

谢谢

【问题讨论】:

    标签: json api sed jq


    【解决方案1】:

    您观察到的模式可能是虚假的,但根据我对您定义的标准的理解,这里有一个 jq 过滤器可以解决问题:

    .odds.data |= map(if keys_unsorted[0:2] - ["label","value"] == [] 
                      then empty else . end)
    

    或者,如果键的顺序相关:

    .odds.data |= map(select(keys_unsorted[0:2] != ["label","value"]))
    

    【讨论】:

    • 这是jq吗?我试过运行:cat 文件 | jq .odds.data |= map(select(keys_unsorted[0:2] != ["label","value"])) ,但是出现错误我该如何使用这个命令?
    • 是的。看起来您没有将 jq 程序放在单引号内。如果您不知道如何正确引用 jq 过滤器,最简单的可能是将 jq 程序放入文件中,然后使用 -f 选项调用 jq。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2015-08-05
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多