首页 > 解决方案 > 通过“路径”从 json 对象中提取数据

问题描述

我正在使用 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 库中的一些函数可以做到这一点。我怎样才能完成这项任务?

标签: jsonpython-3.x

解决方案


我建议使用 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/


推荐阅读