首页 > 解决方案 > 从 Kafka 消息中读取的 Json 路径

问题描述

我有一条如下所示的 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"
            ]

我对此很陌生,需要一些关于如何正确读取属性的建议。任何帮助将不胜感激。谢谢

标签: jsonjsonpath

解决方案


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

下面jsonpath的表达式将为listsample1 和 sample2 返回一个每个项目

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

推荐阅读