Home > front end >  Searching for a string in a json file and extracting its section
Searching for a string in a json file and extracting its section

Time:07-23

I was wondering how to perform the following: 1.search for strings in a json and extract their nested components. given:

"type": "blah",
"animals": [
    {
        "type": "dog1",
        "name": "oscar",
        }
    },
    {
        "type": "dog2",
        "name": "John",
        }
    },
    {
        "type": "cat1",
        "name": "Fred",
        "Colors": [
            "Red"
        ],
        "Contact_info": [
            {
                "Owner": "Jill",
                "Owner_number": "123"
            }
        ],
    
    },
    {
        "type": "cat3",
        "name": "Freddy",
        "Colors": [
            "Blue"
        ],
        "Contact_info": [
            {
                "Owner": "Ann",
                "Owner_number": "1323"
            }
        ],

From this json, I would like to extract all of the animals that are of type cat like cat1 and cat2, as well as all of the information within that block. Like if I search for cat it should return:

{
    "type": "cat1",
    "name": "Fred",
    "Colors": [
        "Red"
    ],
    "Contact_info": [
        {
            "Owner": "Jill",
            "Owner_number": "123"
        }
    ],

},
{
    "type": "cat3",
    "name": "Freddy",
    "Colors": [
        "Blue"
    ],
    "Contact_info": [
        {
            "Owner": "Ann",
            "Owner_number": "1323"
        }
    ],

Not necessarily that format, but just all of the information that has type cat. Im trying to search for objects in a json file and extract features from that search as well as anything nested inside of it. Here is my code so far:



f = open('data.json')
 
# returns JSON object as
# a dictionary
data = json.load(f)
 
# Iterating through the json
# list
for i in data:
    if i['type'] == 'cat':
        print(i['name'])
        print(i['colors'])

        break
 
# Closing file
f.close()```

CodePudding user response:

To begin with, I recommend using the with statement that creates a runtime context that allows you to run a group of statements under the control of a context manager.

It’s much more readable and allows you to skip closing the file since the context manager will do everything for you.

Moving to your problem

Suppose your file is called animals.json

# Import json library to work with json files
import json

# Use context manager
with open("animals.json", "rb") as f:
    # Load animals list from json file
    animals = json.load(f)["animals"]

# Create a list of dictionaries if animal type contains "cat"
cats = [animal for animal in animals if "cat" in animal.get("type")]

# Write data to cats.json
json.dump(cats, open("cats.json", "w"), indent=4, sort_keys=False, ensure_ascii=False)

This code outputs the formatted cats.json file with all necessary elements:

[
    {
        "type": "cat1",
        "name": "Fred",
        "Colors": [
            "Red"
        ],
        "Contact_info": [
            {
                "Owner": "Jill",
                "Owner_number": "123"
            }
        ]
    },
    {
        "type": "cat3",
        "name": "Freddy",
        "Colors": [
            "Blue"
        ],
        "Contact_info": [
            {
                "Owner": "Ann",
                "Owner_number": "1323"
            }
        ]
    }
]
  • Related