【问题标题】:Combine jsonpath expression to read 2 nested properties in json string结合 jsonpath 表达式读取 json 字符串中的 2 个嵌套属性
【发布时间】:2019-11-29 04:43:22
【问题描述】:

我正在使用 slack api (https://slack.com/api/search.messages) 来获取 slack 频道中的帖子并使用 java 代码解析帖子。

以下是示例松弛响应,其中松弛帖子是“匹配”下的“文本”和匹配 - 上一个:

    {
  "ok": true,
  "query": "\"@DTR:JQL\" in:#sydtest-reporting",
  "messages": {
    "total": 16,        
    "matches": [
      {
        "iid": "370f1cc2-aef9-4681-93f1-fa3787ce9d17",
        "team": "T9180DGJH",
        "channel": {
          "id": "C9UPLJ9D2",
          "is_channel": true,              
          "name": "sydtest-reporting",              
          "teams": [
            "T9180DGJH"
          ]
        },
        "type": "message",
        "user": "W9G7PAUCF",
        "username": "200848",
        "ts": "1568962541.016200",
        "text": "@DTR:JQL#SYDEPS AND labels = Nov_2019_CSS_Cycle1",
        "previous": {
          "type": "message",
          "user": "WGGUL08NA",
          "username": "208977",
          "ts": "1568962184.015700",
          "text": "@DTR:2019 November Release",
          "iid": "4bdb76cf-015b-4b43-9608-013b56e47820",
        },

以上响应已排序(“排序”、“时间戳”)。 我正在使用 com.jayway.jsonpath.JsonPath 库中的 read() 来解析上面的 json 并使用以下 2 jsonPathExpression:

$.messages.matches[*].text
$.messages.matches[*].previous.text

目前我正在触发 2 个单独的 JsonPath.read(document, jsonPathExpression) 调用(对上面的每个 jsonPathExpression 调用一个),然后创建一个组合列表,如下所示:

@DTR:JQL#SYDEPS AND labels = Nov_2019_CSS_Cycle1
@DTR:2019 November Release
... many more

这种方法的问题是,虽然每个读取操作都返回排序列表,但当我将两个列表结合起来时,排序是没有意义的。

我正在寻找的是,两个 jsonPathExpression 的单次读取操作。如果需要,我可以使用其他一些 json 库。请指导。

【问题讨论】:

  • 你的问题很抽象,你用的是什么解析器,这是客户端应用,还是web应用,$.messages.是从哪里来的,是不是一种模板?
  • 你是什么意思“每个读取操作返回排序列表”?
  • @silentsudo 我正在使用 com.jayway.jsonpath.JsonPath 解析器。它是一个客户。消息来自 slack api 响应。
  • 您将找到和排序的消息与其看似可选的嵌套“上一个”消息(甚至“下一个”,正如我从 docs 中看到的那样 - 但他们没有组合起来的确切意图是什么?虽然不描述背后的数据模型)?从它们中创建一个排序列表真的有意义吗?按哪个属性排序?我建议给出一个预期与获得结果的具体例子......

标签: java json slack-api jayway


【解决方案1】:

您可以使用以下表达式获取这两个值:

$.messages.matches[*]..text

【讨论】:

  • 当我刷新回答你的答案时弹出:P
  • 谢谢@Anar。我确实尝试过,但我返回了一个很难进一步解析的巨大列表。我需要使用 2 个标准 .text 和 previous.text 进行过滤。
  • @amit 我认为这是使用 JSONPath 可以获得的最接近的方法,因为它不支持单独路径的联合。
  • 谢谢@Anar。你能推荐任何其他可以提供帮助的图书馆吗?
  • @amit 因为您不需要反序列化整个对象,而只需要获取属性,您可能需要一个支持 JSON 树表示的库,例如杰克逊、GSON 等。
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 2019-03-31
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2016-01-16
相关资源
最近更新 更多