Python的json.dumps函数缩进失败

cygmwpex  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(143)

然后,我有一个函数loadDatabase,它完全更新数据库,然后将其作为JSON返回(稍后打印到屏幕上)
问题是它以一种可读性不强的格式打印它,这通常是一个容易解决的问题,使用json.dumps()或bson.jsonutil.dumps()函数可以接受缩进参数。但是,我两种都试过了,似乎都没有效果。
在我的相关代码中,我已经注解掉了我认为对此不重要的行:

def loadDatabase():
    try:
        client.admin.command('ping')
        #logger.info("Successfully connected to MongoDB")
        #print("Database - You successfully connected to MongoDB!")
        #flightCollection.delete_many({}) 
        #flightCollection.insert_many(loadFlights())
        data = flightCollection.find({})
        output = json.dumps(str(data), indent=4)
        return output
    except Exception as e:
        #print(e)
        #logger.setLevel(logging.ERROR)
        #logger.error(e)
        #logger.setLevel(logging.INFO)
        return "DATABASE ERROR: <br>"+str(e)

def loadFlights(): 
    response = amadeus.shopping.flight_offers_search.get(
        originLocationCode='MAD',
        destinationLocationCode='ATH',
        departureDate=str(date.today()),
        adults=1)
    return response.data

我能做些什么来解决这个问题?我已经尝试了这两个转储函数,但是除了手动编写函数来解析它(这是可行的,但我不认为我应该重新发明轮子)之外,我不知道该怎么做
我希望输出是一个格式化的JSON,但相反,它都聚集在一起,例如:
"{'_id': ObjectId('6481bb02cbb598c58691b45e'), 'type': 'flight-offer', 'id': '2', 'source': 'GDS', 'instantTicketingRequired': False, 'nonHomogeneous': False, 'oneWay': False, 'lastTicketingDate': '2023-06-08', 'lastTicketingDateTime': '2023-06-08', 'numberOfBookableSeats': 3, 'itineraries': [{'duration': 'PT12H5M', 'segments': [{'departure': {'iataCode': 'MAD', 'terminal': '4S', 'at': '2023-06-08T22:10:00'}, 'arrival': {'iataCode': 'TLV', 'terminal': '3', 'at': '2023-06-09T03:45:00'}, 'carrierCode': 'IZ', 'number': '232', 'aircraft': {'code': '73H'}, 'operating': {'carrierCode': 'QS'}, 'duration': 'PT4H35M', 'id': '3', 'numberOfStops': 0, 'blacklistedInEU': False}, {'departure': {'iataCode': 'TLV', 'terminal': '1', 'at': '2023-06-09T09:05:00'}, 'arrival': {'iataCode': 'ATH', 'at': '2023-06-09T11:15:00'}, 'carrierCode': 'IZ', 'number': '211', 'aircraft': {'code': '73H'}, 'operating': {'carrierCode': 'QS'}, 'duration': 'PT2H10M', 'id': '4', 'numberOfStops': 0, 'blacklistedInEU': False}]}], 'price': {'currency': 'EUR', 'total': '147.32', 'base': '112.00', 'fees': [{'amount': '0.00', 'type': 'SUPPLIER'}, {'amount': '0.00', 'type': 'TICKETING'}], 'grandTotal': '147.32', 'additionalServices': [{'amount': '37.33', 'type': 'CHECKED_BAGS'}]}, 'pricingOptions': {'fareType': ['PUBLISHED'], 'includedCheckedBagsOnly': False}, 'validatingAirlineCodes': ['IZ'], 'travelerPricings': [{'travelerId': '1', 'fareOption': 'STANDARD', 'travelerType': 'ADULT', 'price': {'currency': 'EUR', 'total': '147.32', 'base': '112.00'}, 'fareDetailsBySegment': [{'segmentId': '3', 'cabin': 'ECONOMY', 'fareBasis': 'XSIP', 'class': 'X', 'includedCheckedBags': {'quantity': 0}}, {'segmentId': '4', 'cabin': 'ECONOMY', 'fareBasis': 'XSIP', 'class': 'X', 'includedCheckedBags': {'quantity': 0}}]}]}"
我已经尝试了json.dumps()或bson.jsonutil.dumps()函数,使用了各种缩进,以各种不同的方式应用,以及转换为字符串、列表和其他几种修改和变体

cfh9epnr

cfh9epnr1#

代码的问题在于,您正在将从MongoDB检索到的数据转换为字符串,然后尝试在该字符串上使用json.dumps()。这不会像您所期望的那样工作,因为json.dumps()需要字典、列表或其他JSON可序列化对象,而不是字符串。

from bson.json_util import dumps

def loadDatabase():
    try:
        client.admin.command('ping')
        # logger.info("Successfully connected to MongoDB")
        # print("Database - You successfully connected to MongoDB!")
        # flightCollection.delete_many({}) 
        # flightCollection.insert_many(loadFlights())
        data = flightCollection.find({})
        
        # Convert cursor into list of dictionaries
        documents = [doc for doc in data]

        # Use bson.json_util.dumps to serialize the ObjectId's
        output = dumps(documents, indent=4)
        return output

注意,我使用了bson.json_util而不是json.dumps的转储,因为它能够序列化ObjectId示例,这些示例通常用作MongoDB中的文档ID。标准的json.dumps函数不理解如何序列化这些示例。
阅读更多here

相关问题