首页 文章

在json对象中查找嵌套字典中的项目

提问于
浏览
1

我正在尝试接受一个json对象作为输入,并找到符合特定条件的项目计数 . json对象结构在嵌套的python字典中,例如:

businesses= ["{\"hours\":
            {
            \"tuesday\": [[\"11:30\", \"23:00\"]],
            \"thursday\": [[\"11:30\", \"23:00\"]],
            \"wednesday\": [[\"11:30\", \"23:00\"]],
            \"friday\": [[\"11:30\", \"23:00\"]],
            \"sunday\": [[\"9:00\", \"23:00\"]],
            \"monday\": [[\"11:30\", \"23:00\"]],
            \"saturday\": [[\"11:30\", \"23:00\"]]
            },
            \"name\": \"XYZ\"
        }"]

该结构中将有多个项目 . 我遇到的问题是写入for循环进入关卡,并搜索在星期日上午10点之前开放的商家 .

所以这样的事情:

def count_businesses(object):
    for i in object:
        for j in i:
        ....

但是当我达到那个级别时,它似乎输出了字典的每一个字母 . 此外,我不知道如何编写函数来查找它打开的日期和时间,这对我来说必须在星期日上午10点之前找到,并返回计数 . 时间位于此对象中字典内的数组中,如图所示 .

任何帮助,将不胜感激!

1 回答

  • 1

    似乎python词典之间存在一些混淆 . 您在 businesses 中的数组中的数据实际上是JavaScript Object Notation(JSON)中的字符串,python将其视为字符串 . 要将它用作python字典,您需要使用python的 json 库进行转换 . 转换看起来像,

    import json
    
    python_obj = json.loads(json_str)
    

    您提供的对象是一个JSON字符串数组,如

    businesses = ["{\"hours\":"
                "{"
                "\"tuesday\": [[\"11:30\", \"23:00\"]],"
                "\"thursday\": [[\"11:30\", \"23:00\"]],"
                "\"wednesday\": [[\"11:30\", \"23:00\"]],"
                "\"friday\": [[\"11:30\", \"23:00\"]],"
                "\"sunday\": [[\"9:00\", \"23:00\"]],"
                "\"monday\": [[\"11:30\", \"23:00\"]],"
                "\"saturday\": [[\"11:30\", \"23:00\"]]"
                "},"
                "\"name\": \"XYZ\""
            "}"]
    

    python字典的数组如下所示

    businesses = [
        {
            "hours":{
                "tuesday":[["11:30","23:00"]],
                "thursday":[["11:30","23:00"]],
                "wednesday":[["11:30","23:00"]],
                "friday":[["11:30", "23:00"]],
                "sunday":[["9:00", "23:00"]],
                "monday":[["11:30", "23:00"]],
                "saturday":[["11:30", "23:00"]]
            },
            "name":"XYZ"
        }
    ]
    

    所以,你看到它输出每个字母的原因是因为你在迭代字符串,而不是python字典 . 当python迭代一个字符串时,它会查看每个字符 . 就像下面这样 .

    string_data = "123456789"
    # will iterate through each character
    for i in string_data:
        print(i) # will print 9 times each time outputting a character in order
    

    至于函数,你需要确保在进行时间比较时,使用python时间对象而不是字符串,因为这样可以准确地比较时间 . 我不完全确定为什么时间列在嵌套数组中,例如 [["11:30","23:00"]] ,因此如果数据的格式与其他业务的格式不同,您可能需要修改以下函数 .

    这是一个描述您需要的功能 .

    import json, datetime
    
    businesses = ["{\"hours\":"
                "{"
                "\"tuesday\": [[\"11:30\", \"23:00\"]],"
                "\"thursday\": [[\"11:30\", \"23:00\"]],"
                "\"wednesday\": [[\"11:30\", \"23:00\"]],"
                "\"friday\": [[\"11:30\", \"23:00\"]],"
                "\"sunday\": [[\"9:00\", \"23:00\"]],"
                "\"monday\": [[\"11:30\", \"23:00\"]],"
                "\"saturday\": [[\"11:30\", \"23:00\"]]"
                "},"
                "\"name\": \"XYZ\""
            "}"]
    
    
    def count_businesses(business_list):
        """
        :param business_list: An array of business in JSON to query from
        :return: Int of the count of businesses that are open on Sunday before 10 am
        """
    
        # initialize the array that will contain the businesses that meet the search criteria
        businesses_found = []
    
        # python time object of 10:00am that will be used to check against
        opening_business_time = datetime.time(hour=10)
    
        # iterate through each busineses to check if it meets the search criteria
        for business in business_list:
    
            # since each business is in JSON, we convert it into a Python object
            business_obj = json.loads(business)
    
            # Look into the 'hours' key, then the 'sunday' key and get the first item in the array. ( i.e ["11:30","23:00"])
            sunday_hours = business_obj["hours"]["sunday"][0]
    
            # read in the sunday opening hours as a string from the first value of the array. {i.e "11:30")
            sunday_opening_hours_str = sunday_hours[0]
    
            # convert the sunday opening hours into a time object so it can be compared.
            # '%H:%M' looks for the format HH:MM in a string.
            # for more reference. https://docs.python.org/3.6/library/datetime.html#strftime-and-strptime-behavior
            sunday_opening_hours_time = datetime.datetime.strptime(sunday_opening_hours_str, '%H:%M').time()
    
            # if sunday opening hours is before 10 am
            if sunday_opening_hours_time < opening_business_time:
    
                # add the business object to the list
                businesses_found.append(business_obj)
    
        # returns the count of the businesses that met the search criteria
        return len(businesses_found)
    
    
    total = count_businesses(businesses)
    
    print(total)
    

相关问题