zexapod
zexapod

Reputation: 45

Conditionally merging two separate JSON objects in JQ

This is how my input looks:

{
"text" : "Some text here"
}
{
  "usage": {
    "text_units": 1,
    "text_characters": 101,
    "features": 1
  },
  "language": "en",
  "categories": [
    {
      "score": 0.655041,
      "label": "/technology law, govt and politics/espionage and intelligence/surveillance"
    },
    {
      "score": 0.639809,
      "label": "/technology and computing/computer security/network security"
    },
    {
      "score": 0.624533,
      "label": "/business and industrial/business operations"
    }
  ]
}

Using JQ, if the first element of array category in the second object contains /technology, I want to add a new field named relevant with 1 as value (which I managed), and copy the text field from the first object.

So, the expected output is:

{
  "usage": {
    "text_units": 1,
    "text_characters": 101,
    "features": 1
  },
  "language": "en",
  "categories": [
    {
      "score": 0.655041,
      "label": "/technology law, govt and politics/espionage and intelligence/surveillance"
    },
    {
      "score": 0.639809,
      "label": "/technology and computing/computer security/network security"
    },
    {
      "score": 0.624533,
      "label": "/business and industrial/business operations"
    }
  ],
  "relevant": 1,
  "text": "Some text here"
}

And this is what I have done so far:

if .categories[0].label  | test("/technology"; "i") then . |=( . + {"relevant": 1} + {"text": .text}) else . |= . + {"relevant": 0} end

Upvotes: 1

Views: 58

Answers (1)

oguz ismail
oguz ismail

Reputation: 50750

Your input consists of two separate objects. In order to be able to access the first while processing the second, you could save the first into a variable.

. as {$text} | input | if .categories[0].label | test("/technology"; "i") then . + {relevant: 1, $text} else . + {relevant: 0} end

Online demo

Upvotes: 2

Related Questions