You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@groovy.apache.org by Brandon Metcalf <bw...@gmail.com> on 2018/11/27 17:20:17 UTC

finding value of key at same level as another key

Hello,

I have the following json

{
  "status": {
    "group": "group1",
    "partitions": [
      {
        "topic": "topic1",
        "partition": 0,
        "start": {
          "offset": 0,
          "timestamp": 1543337772415,
          "lag": 0,
          "max_offset": 0
        },
        "end": {
          "offset": 0,
          "timestamp": 1543337812000,
          "lag": 0,
          "max_offset": 0
        }
      }
    ]
  }
}

I'm looking for a way in groovy to find the value of
status.partitions.end.lag when I know the values of status.group,
status.partitions.topic and status.partitions.partition?  I may need to
rethink my approach to how I think I should parse this json, but hopefully
there is an easy way to do this.

Also, there can be multiple levels of the values that I know.  Just showing
one for simplicity.

Thanks.

Re: finding value of key at same level as another key

Posted by Brandon Metcalf <bw...@gmail.com>.
Perfect.  Thank you very much.

On Tue, Nov 27, 2018 at 12:54 PM Winnebeck, Jason <
Jason.Winnebeck@windstream.com> wrote:

> *def *parsed = *new *JsonSlurper().parseText(json)
> *assert *parsed.status.group ==
> *'group1' **assert *parsed.status.partitions.find { it.topic == *'topic1'
> *&& it.partition == 0 }?.end?.lag == 0
>
>
>
> Putting your JSON into a string variable “json”, the above asserts pass.
> The group was not put into a find because the status field is an object,
> not an array, so you’d check it with a normal if statement rather than
> find. The result is the end.lag field of the first partition found matching
> the topic and partition number, or null if no partition was found, or the
> first partition found does not have the field, or if the field exists but
> is null.
>
>
>
> If you want to limit only to partitions with lag defined, you can change
> the search accordingly:
>
> *assert *parsed.status.partitions.find { it.topic == *'topic1' *&& it.partition == 0 && it.end?.lag != *null *}?.end?.lag == 0
>
>
>
> Jason
>
>
>
> *From:* Brandon Metcalf <bw...@gmail.com>
> *Sent:* Tuesday, November 27, 2018 12:20 PM
> *To:* users@groovy.apache.org
> *Subject:* finding value of key at same level as another key
>
>
>
> Hello,
>
>
>
> I have the following json
>
>
>
> {
>
>   "status": {
>
>     "group": "group1",
>
>     "partitions": [
>
>       {
>
>         "topic": "topic1",
>
>         "partition": 0,
>
>         "start": {
>
>           "offset": 0,
>
>           "timestamp": 1543337772415,
>
>           "lag": 0,
>
>           "max_offset": 0
>
>         },
>
>         "end": {
>
>           "offset": 0,
>
>           "timestamp": 1543337812000,
>
>           "lag": 0,
>
>           "max_offset": 0
>
>         }
>
>       }
>
>     ]
>
>   }
>
> }
>
>
>
> I'm looking for a way in groovy to find the value of
> status.partitions.end.lag when I know the values of status.group,
> status.partitions.topic and status.partitions.partition?  I may need to
> rethink my approach to how I think I should parse this json, but hopefully
> there is an easy way to do this.
>
>
>
> Also, there can be multiple levels of the values that I know.  Just
> showing one for simplicity.
>
>
>
> Thanks.
>
>
>

RE: finding value of key at same level as another key

Posted by "Winnebeck, Jason" <Ja...@windstream.com>.
def parsed = new JsonSlurper().parseText(json)
assert parsed.status.group == 'group1'
assert parsed.status.partitions.find { it.topic == 'topic1' && it.partition == 0 }?.end?.lag == 0

Putting your JSON into a string variable “json”, the above asserts pass. The group was not put into a find because the status field is an object, not an array, so you’d check it with a normal if statement rather than find. The result is the end.lag field of the first partition found matching the topic and partition number, or null if no partition was found, or the first partition found does not have the field, or if the field exists but is null.

If you want to limit only to partitions with lag defined, you can change the search accordingly:

assert parsed.status.partitions.find { it.topic == 'topic1' && it.partition == 0 && it.end?.lag != null }?.end?.lag == 0

Jason

From: Brandon Metcalf <bw...@gmail.com>
Sent: Tuesday, November 27, 2018 12:20 PM
To: users@groovy.apache.org
Subject: finding value of key at same level as another key

Hello,

I have the following json

{
  "status": {
    "group": "group1",
    "partitions": [
      {
        "topic": "topic1",
        "partition": 0,
        "start": {
          "offset": 0,
          "timestamp": 1543337772415,
          "lag": 0,
          "max_offset": 0
        },
        "end": {
          "offset": 0,
          "timestamp": 1543337812000,
          "lag": 0,
          "max_offset": 0
        }
      }
    ]
  }
}

I'm looking for a way in groovy to find the value of status.partitions.end.lag when I know the values of status.group, status.partitions.topic and status.partitions.partition?  I may need to rethink my approach to how I think I should parse this json, but hopefully there is an easy way to do this.

Also, there can be multiple levels of the values that I know.  Just showing one for simplicity.

Thanks.