Jess
Jess

Reputation: 227

JSON Slurper Offsets

I have a large JSON file that I'm trying to parse with JSON Slurper. The JSON file consists of information about bugs so it has things like issue keys, descriptions, and comments. Not every issue has a comment though. For example, here is a sample of what the JSON input looks like:

    {
   "projects": [
      {
      "name": "Test Project",
      "key": "TEST",
      "issues": [
      {
         "key": "BUG-1",
         "priority": "Major",
         "comments": [
           {
             "author": "a1",
             "created": "d1",
             "body": "comment 1"
           },
           {
             "author": "a2",
             "created": "d2",
             "body": "comment 2"
           }
         ]
      },
      {
         "key": "BUG-2",
         "priority": "Major"
      },
      {
         "key": "BUG-3",
         "priority": "Major",
         "comments": [
           {
             "author": "a3",
             "created": "d3",
             "body": "comment 3"
           }
         ]
      }
    ]
}
]
}

I have a method that creates Issue objects based on the JSON parse. Everything works well when every issue has at least one comment, but, once an issue comes up that has no comments, the rest of the issues get the wrong comments. I am currently looping through the JSON file based on the total number of issues and then looking for comments using how far along in the number of issues I've gotten. So, for example,

parsedData.issues.comments.body[0][0][0]

returns "comment 1". However,

parsedData.issues.comments.body[0][1][0]

returns "comment 3", which is incorrect. Is there a way I can see if a particular issue has any comments? I'd rather not have to edit the JSON file to add empty comment fields, but would that even help?

Upvotes: 1

Views: 310

Answers (1)

tim_yates
tim_yates

Reputation: 171084

You can do this:

parsedData.issues.comments.collect { it?.body ?: [] }

So it checks for a body and if none exists, returns an empty list

UPDATE
Based on the update to the question, you can do:

parsedData.projects.collectMany { it.issues.comments.collect { it?.body ?: [] } }

Upvotes: 2

Related Questions