【问题标题】:Json Path Read from a Kafka Message从 Kafka 消息中读取的 Json 路径
【发布时间】:2021-12-06 20:46:28
【问题描述】:

我有一条如下所示的 kafka 消息,我试图从 json 路径中读取数据。但是,在从 json 路径读取某些属性时,我遇到了挑战。这是示例消息。

样本1:

{
  "header": {
    "bu": "google",
    "id": "12345",
    "bum": "google",
    "originTimestamp": "2021-10-09T15:17:09.842+00:00",
    "batchSize": "0",
    "jobType": "Batch"
  },
  "payload": {
    "derivationdetails": {
      "Id": "6783jhvvh897u31y283y",
      "itemid": "1234567",
      "batchid": 107,
      "attributes": {
        "itemid": "1234567",
        "lineNbr": "1498",
        "cat": "5929",
        "Id": "6783jhvvh897u31y283y",
        "indicator": "false",
        "subcat": "3514"
      },
      "Exception": {
        "values": [
          {
            "type": "PICK",
            "value": "blocked",
            "Reason": [
              "RULE"
            ],
            "rules": [
              "439"
            ]
          }
        ],
        "rulesBagInfo": [
          {
            "Idtype": "XXXX",
            "uniqueid": "7889423rbhevfhjaufdyeuiryeukjbdafvjd",
            "rulesMatch": [
              "439"
            ]
          }
        ]
      }
    }
  }
}

示例 2:相同的消息,但看到“有效负载”的差异

{
  "header": {
    "bu": "google",
    "id": "12345",
    "bum": "google",
    "originTimestamp": "2021-10-09T15:17:09.842+00:00",
    "batchSize": "0",
    "jobType": "Batch"
  },
  "payload": {
      "Id": "6783jhvvh897u31y283y",
      "itemid": "1234567",
      "batchid": 107,
      "attributes": {
        "itemid": "1234567",
        "lineNbr": "1498",
        "cat": "5929",
        "Id": "6783jhvvh897u31y283y",
        "indicator": "false",
        "subcat": "3514"
      },
      "Exception": {
        "values": [
          {
            "type": "PICK",
            "value": "blocked",
            "Reason": [
              "RULE"
            ],
            "rules": [
              "439"
            ]
          }
        ],
        "rulesBagInfo": [
          {
            "Idtype": "XXXX",
            "uniqueid": "7889423rbhevfhjaufdyeuiryeukjbdafvjd",
            "rulesMatch": [
              "439"
            ]
          }
        ]
      }
  }
}

如果您观察到,有时消息包含“派生详细信息”,有时则没有。但不管它是否存在,我都需要读取 id、itemid 和 batchid 的值。我尝试使用

$.payload[*].id
$.payload[*].itemid
$.payload[*].batchid

但我看到,对于 batchid,即使它在消息中有一个值,它也会返回 null,如果我使用上述内容,“属性”下的属性会返回 null。对于使用此(示例)的“属性”下的字段:

$.payload.attributes.itemId

而且,对于如何阅读以下部分完全空白。

"Exception": {
        "values": [
          {
            "type": "PICK",
            "value": "blocked",
            "Reason": [
              "RULE"
            ],
            "rules": [
              "439"
            ]
          }
        ],
        "rulesBagInfo": [
          {
            "Idtype": "XXXX",
            "uniqueid": "7889423rbhevfhjaufdyeuiryeukjbdafvjd",
            "rulesMatch": [
              "439"
            ]

我是新手,需要一些关于如何正确读取属性的建议。任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: json jsonpath


    【解决方案1】:

    使用..(递归下降,深度扫描。JSONPath 借用了 E4X 的这种语法。) 来获取值。但是如果有多个具有相同键的条目嵌套在深处,它将返回一个列表。

    jsonpath 下方的表达式将返回一个 list,其中 sample1 和 sample2 各有一项

    $.payload..attributes.Id
    $.payload..attributes.itemid
    $.payload..batchid
    $.payload..Exception
    

    【讨论】:

    • 感谢您的响应,但如果有多个条目,payload..batchid 将返回一个列表。我们如何克服这个问题并只返回 1 个值?
    • 您需要提供包含多个条目的示例,以便我提供帮助。帖子中的两个样本都只有一个批次。它类似于 Id 和 itemid 您需要从属性或您拥有的任何其他键中获取
    • 得到了这个问题,但最后一个问题,如果我在“规则”中有一个值数组:[“439”,“441”,“465”],那么我该如何阅读里面有所有的值吗?
    • 如果您在规则中有一个数组或单个元素,路径应该仍然相同,这没有区别。 $.payload..Exception.values[*].rules[*]
    猜你喜欢
    • 2021-03-01
    • 2022-01-04
    • 2021-04-13
    • 2018-10-24
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多