compare list of kwys with json keys and create new json

Question:

i have list of keys (am giving only 4 as example. it may be 100-1k keys]

['session_id','following_status','job_name','last_interaction']

Now, i get input json as below,

    [
  {
    "updated_data": {
      "last_interaction": "2022-06-20 06:55:55.652434",
      "following_status": "not followed",
      "session_id": "abc1",
      "job_name": "blogger-following",
      "target": "ghjk",
      "liked": 21,
      "watched": 8,
      "commented": 0,
      "followed": false,
      "unfollowed": false,
      "scraped": false,
      "pm_sent": false
    }
  },
  {
    "updated_data": {
      "last_interaction": "2022-06-20 06:55:55.652434",
      "following_status": "followed",
      "session_id": "abc2",
      "job_name": "blogger-following",
      "target": "name2",
      "liked": 1,
      "watched": 7,
      "commented": 0,
      "followed": false,
      "unfollowed": false,
      "scraped": false,
      "pm_sent": false
    }
  },
  {
    "updated_data": {
      "last_interaction": "2022-06-20 06:55:55.652434",
      "following_status": "followed",
      "session_id": "abc3",
      "job_name": "blogger-following",
      "target": "name3",
      "liked": 67,
      "watched": 78,
      "commented": 0,
      "followed": false,
      "unfollowed": false,
      "scraped": false,
      "pm_sent": false
    }
  },
  {
    "updated_data": {
      "last_interaction": "2022-06-20 06:55:55.652434",
      "following_status": "followed",
      "session_id": "abc4",
      "job_name": "blogger-following",
      "target": "name4",
      "liked": 210,
      "watched": 77,
      "commented": 0,
      "followed": false,
      "unfollowed": false,
      "scraped": false,
      "pm_sent": false
    }
  },
  {
    "updated_data": {
      "last_interaction": "2022-06-20 06:55:55.652434",
      "following_status": "followed",
      "session_id": "abc5",
      "job_name": "blogger-following",
      "target": "name5",
      "liked": 21,
      "watched": 790,
      "commented": 0,
      "followed": false,
      "unfollowed": false,
      "scraped": false,
      "pm_sent": false
    }
  },
  {
    "updated_data": {
      "last_interaction": "2022-06-20 06:55:55.652434",
      "following_status": "not followed",
      "session_id": "abc6",
      "job_name": "blogger-following",
      "target": "name6",
      "liked": 81,
      "watched": 7,
      "commented": 0,
      "followed": false,
      "unfollowed": false,
      "scraped": false,
      "pm_sent": false
    }
  }
]

i need to iterate json and if matches the keys in the above list i need to get those key values and push to a new json file

i should create json by matching keys and if not matching ignore those key, values.

output will be,

[
  {
    "last_interaction": "2022-06-20 06:55:55.652434",
    "following_status": "not followed",
    "session_id": "abc1",
    "job_name": "blogger-following"
    
  },
  {
    "last_interaction": "2022-06-20 06:55:55.652434",
    "following_status": "followed",
    "session_id": "abc2",
    "job_name": "blogger-following"
  },
  {
    "last_interaction": "2022-06-20 06:55:55.652434",
    "following_status": "followed",
    "session_id": "abc3",
    "job_name": "blogger-following"
  },
  {
    "last_interaction": "2022-06-20 06:55:55.652434",
    "following_status": "followed",
    "session_id": "abc4",
    "job_name": "blogger-following"
  },
  {
    "last_interaction": "2022-06-20 06:55:55.652434",
    "following_status": "followed",
    "session_id": "abc5",
    "job_name": "blogger-following"
  },
  {
    "last_interaction": "2022-06-20 06:55:55.652434",
    "following_status": "not followed",
    "session_id": "abc6",
    "job_name": "blogger-following"
  }
]

what i tried,

import json
from datetime import datetime
from operator import itemgetter


with open("data.json", "r") as f_in:
    data = json.load(f_in)

items = ["session_id", "following_status", "job_name", "last_interaction"]

i = itemgetter(*items)
out = [dict(zip(items, v)) for v in enumerate(data[0]['updated_data'].items())]

Even i tried this,

[{k: msgs[0]['updated_data'][k] for k in items if k in enumerate(msgs[0]['updated_data'].items())}]

Not worked

please suggest me how can i achieve.

Asked By: ditil

||

Answers:

Apply the itemgetter i respectively:

keys = ["session_id", "following_status", "job_name", "last_interaction"]
i = itemgetter(*keys)
out = [dict(zip(keys, i(d['updated_data']))) for d in data]
print(out)

[{'following_status': 'not followed',
  'job_name': 'blogger-following',
  'last_interaction': '2022-06-20 06:55:55.652434',
  'session_id': 'abc1'},
 {'following_status': 'followed',
  'job_name': 'blogger-following',
  'last_interaction': '2022-06-20 06:55:55.652434',
  'session_id': 'abc2'},
 {'following_status': 'followed',
  'job_name': 'blogger-following',
  'last_interaction': '2022-06-20 06:55:55.652434',
  'session_id': 'abc3'},
 {'following_status': 'followed',
  'job_name': 'blogger-following',
  'last_interaction': '2022-06-20 06:55:55.652434',
  'session_id': 'abc4'},
 {'following_status': 'followed',
  'job_name': 'blogger-following',
  'last_interaction': '2022-06-20 06:55:55.652434',
  'session_id': 'abc5'},
 {'following_status': 'not followed',
  'job_name': 'blogger-following',
  'last_interaction': '2022-06-20 06:55:55.652434',
  'session_id': 'abc6'}]
Answered By: RomanPerekhrest
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.