簡體   English   中英

通過“路徑”從json對象中提取數據

[英]Extract data from json object by "path"

我正在使用 Python 3.6。

我有一個 json 對象,其字符串表示如下:

json.dumps(sample_data)

{"State": "OFF", "RepresentedBy": {"Agency": null, "Manager": null}, "NegativeKeywords": {"Items": ["rain", "thunder", "lightning"]}, "StartDate": "2019-06-16", "TimeZone": "Europe/Paris", "Funds": {"Mode": "SHARED_ACCOUNT_FUNDS", "SharedAccountFunds": {"Refund": 0, "Spend": 0}}, "DailyBudget": null, "StatusPayment": "ALLOWED", "Id": 44049374, "StatusClarification": "Accepted by moderator", "EndDate": null, "Notification": {"SmsSettings": {"TimeTo": "21:00", "TimeFrom": "09:00"}, "EmailSettings": {"SendAccountNews": "YES", "CheckPositionInterval": 60, "Email": "petrov.context.ads@yandex.ru", "WarningBalance": 20, "SendWarnings": "NO"}}, "BlockedIps": {"Items": ["76.239.56.11", "93.185.26.46"]}, "Name": "\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440/\u041f\u041e\u0418\u0421\u041a/\u041c\u043e\u0441\u043a\u0432\u0430", "TextCampaign": {"Settings": [{"Value": "NO", "Option": "ADD_TO_FAVORITES"}, {"Option": "REQUIRE_SERVICING", "Value": "NO"}, {"Value": "YES", "Option": "SHARED_ACCOUNT_ENABLED"}, {"Option": "DAILY_BUDGET_ALLOWED", "Value": "YES"}, {"Value": "YES", "Option": "MAINTAIN_NETWORK_CPC"}, {"Value": "NO", "Option": "ENABLE_SITE_MONITORING"}, {"Option": "ADD_METRICA_TAG", "Value": "YES"}, {"Option": "ADD_OPENSTAT_TAG", "Value": "NO"}, {"Value": "YES", "Option": "ENABLE_EXTENDED_AD_TITLE"}, {"Option": "ENABLE_COMPANY_INFO", "Value": "YES"}, {"Value": "NO", "Option": "EXCLUDE_PAUSED_COMPETING_ADS"}, {"Option": "ENABLE_AREA_OF_INTEREST_TARGETING", "Value": "YES"}], "PriorityGoals": null, "BiddingStrategy": {"Network": {"BiddingStrategyType": "SERVING_OFF"}, "Search": {"BiddingStrategyType": "AVERAGE_CPC", "AverageCpc": {"AverageCpc": 20000000, "WeeklySpendLimit": null}}}, "RelevantKeywords": {"OptimizeGoalId": 0, "BudgetPercent": 40}, "CounterIds": {"Items": [54087493]}}, "Currency": "RUB", "Statistics": {"Clicks": 0, "Impressions": 0}, "ClientInfo": "\u041f\u0435\u0442\u0440\u043e\u0432 \u041c\u0438\u0445\u0430\u0438\u043b", "Status": "ACCEPTED", "Type": "TEXT_CAMPAIGN", "TimeTargeting": {"HolidaysSchedule": null, "ConsiderWorkingWeekends": "YES", "Schedule": {"Items": [["1", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"], ["2", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"], ["3", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"], ["4", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"], ["5", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"], ["6", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"], ["7", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100", "100"]]}}, "SourceId": null, "ExcludedSites": null}

好吧,在 Python 中,它只是字典、列表和字符串的字典。

我想創建一個函數來通過這個 json 對象中的“路徑”提取數據。

path = '["TextCampaign"]["Settings"][0]["Option"]'

def extract_data(json_object, path):
    # The code
    return data

assert sample_data["TextCampaign"]["Settings"][0]["Option"]==extract_data(json_object, path)  

也許 json 庫中的某些函數可以做到這一點。 我怎樣才能完成這個任務?

我建議使用 JSONPath 語法(基於 XPath): https ://jsonpath.com/

有一個python庫實現了這個: https : //pypi.org/project/jsonpath/

path = 'TextCampaign.Settings[0].Option'

這相當於:

sample_data["TextCampaign"]["Settings"][0]["Option"]

你可以在這里試試: https : //jsonpath.com/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM