'Find a value in JSON using Python

I’ve previously succeeded in parsing data from a JSON file, but now I’m facing a problem with the function I want to achieve. I have a list of names, identification numbers and birthdate in a JSON. What I want to get in Python is to be able to let a user input a name and retrieve his identification number and the birthdate (if present).

This is my JSON example file:

[
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": null
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "15/02/1989"
 },
 {
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "27/09/1994"
 }
]

To be clear, I want to input "V410Z8" and get his name and his birthdate.

I tried to write some code in Python but I only succeed in searching for “id_number” and not for what is inside “id_number” for example "V410Z8".

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json 

database = "example.json"
data = json.loads(open(database).read())

id_number = data[0]["id_number"]
print id_number

Thank you for your support, guys :)



Solution 1:[1]

You have to iterate over the list of dictionaries and search for the one with the given id_number. Once you find it you can print the rest of its data and break, assuming id_number is unique.

data = [
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": None
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "15/02/1989"
 },
 {
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "27/09/1994"
 }
]

for i in data:
    if i['id_number'] == 'V410Z8':
        print(i['birthdate'])
        print(i['name'])
        break

If you have control over the data structure, a more efficient way would be to use the id_number as a key (again, assuming id_number is unique):

data =  { "SA4784" : {"name": "Mark", "birthdate": None},
          "V410Z8" : { "name": "Vincent", "birthdate": "15/02/1989"},
          "CZ1094" : {"name": "Paul", "birthdate": "27/09/1994"}
        }

Then all you need to do is try to access it directly:

try:
    print(data["V410Z8"]["name"])
except KeyError:
    print("ID doesn't exist")
>> "Vincent"

Solution 2:[2]

Using lamda in Python

data = [
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": None
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "15/02/1989"
 },
 {
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "27/09/1994"
 }
]

Using Lambda and filter

print(list(filter(lambda x:x["id_number"]=="CZ1094",data)))

Output

[{'id_number': 'CZ1094', 'name': 'Paul', 'birthdate': '27/09/1994'}]

Solution 3:[3]

You can use list comprehension:

Given

data = [
    {
    "id_number": "SA4784",
    "name": "Mark",
    "birthdate": None
    },
    {
    "id_number": "V410Z8",
    "name": "Vincent",
    "birthdate": "15/02/1989"
    },
    {
    "id_number": "CZ1094",
    "name": "Paul",
    "birthdate": "27/09/1994"
    }
    ]

to get the list item(s) with id_number equal to "V410Z8" you may use:

result = [x for x in data if x["id_number"]=="V410Z8"]

result will contain:

[{'id_number': 'V410Z8', 'name': 'Vincent', 'birthdate': '15/02/1989'}]

In case the if condition is not satisfied, result will contain an empty list: []

Solution 4:[4]

data = [
 {
   "id_number": "SA4784",
   "name": "Mark",
   "birthdate": None
 },
 {
   "id_number": "V410Z8",
   "name": "Vincent",
   "birthdate": "14/02/1989"
 },
 {
   "id_number": "CZ1093",
   "name": "Paul",
   "birthdate": "26/09/1994"
 }
]

list(map(lambda x:x if x["id_number"]=="cz1093" ,data)

Output should be

[{
   "id_number": "CZ1094",
   "name": "Paul",
   "birthdate": "26/09/1994"
 }]

Solution 5:[5]

If you are only interested in one or a subset of total results, then I'd suggest a generator function as the fastest solution, since it will not unnecessarily iterate over every item regardless, and is more memory efficient:

def gen_func(data, search_term):
    for i in data:
        if i['id_number'] == search_term:
            yield i

You can then run the following to retrieve results for CZ1094:

foo = gen_func(data, 'CZ1094')
next(foo)
{'id_number': 'CZ1094', 'name': 'Paul', 'birthdate': '27/09/1994'}

NB: You'll need to handle StopIteration at end of iterable.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Devandran
Solution 3 Paulo Belo
Solution 4 mypetlion
Solution 5 Zach Cleary