t.me/atinfo_chat Telegram группа по автоматизации тестирования

json, python соответствие параметра и значения

Теги: #<Tag:0x00007f9b025f54c0> #<Tag:0x00007f9b025f5330>

Господа, подскажите пожалуйста начинающему…
есть некая страница. в ней данные в формате json
пример:

{
    "response": {
        "job": [
            {
                "id": "[MediaID]",
                "userid": "[UserID]",
                "sourcefile": "[SourceFile]",
                "status": "[MediaStatus]",
                "notifyurl": "[NotifyURL]",
                "created": "[Date]",
                "started": "[Date]",
                "finished": "[Date]",
                "prevstatus": "[MediaStatus]",
                "downloaded": "[Date]",
                "filesize": "[FileSize]",
                "processor": "[AMAZON | RACKSPACE]",
                "progress": "[TotalProgress]",
                "time_left": "[TotalTimeLeft]",
                "format": [
                    {
                        "id": "[ID]",
                        "status": "[Status]",
                        "created": "[Date]",

задача:
На открытой странице в секции ‘Response’ во вкладке JSON проверить:

  • параметр ‘processor’ содержит значения ‘AMAZON’ и ‘RACKSPACE’
  • на уровне ‘format’ параметр ‘status’ равен ‘Status’

на курсах, спасибо преподавателям, много узнал и, надеюсь, многому научился… но вот такого рода задачи не проходили.
подскажите, как сие сделать? какие темы изучить, чтобы понять как в питоне сделать данную проверку.
Спасибо

Мало данных, но если предположить, что JSON со страницы уже получен:

import json
import re

my_str = '{"key": "value"}'
print(json.loads(my_str).get('key'))  # 1
r = re.search(r'"key": "(.*?)"', my_str)  # 2
print(r.group(1) if r else None)  # 2

Надеюсь понятно, что первый вариант предпочтительнее, т.к. регулярка имеет ряд ограничений типа иерархии

спасибо большое…
а если предположить, что json не получен? )

Извините, если не в тему, python не занимался, но если попробовать через jsonpath? https://www.journaldev.com/33265/python-jsonpath-examples

спасибо большое. изучу тему…

Тогда врядли стоит ожидать помощи без имеющегося кода и примера страницы, экстрасенсы на другом форуме

А если JSON’a нет, то библиотекой requests получить eго =)

url https://api.encoding.com/reference#responses-getstatus-extended
вот отсюда вытащить данные и в python сделать тест

касательно второй предложенной идеи.
не могу импортировать библиотеку jsonpath-ng


что-то не то делаю?

во!!! подскажите убогому, как это сделать…

Строго говоря, команда должна быть

pip install jsonpath-ng

если там есть виртуальное окружение, то pip ему соответствует, не надо играться с версиями, pip install <package_name> сработает

регулярка-то здесь зачем?
берём словарик resp_dict = json.loads(response) начинаем смотреть на нужные элементы.
проверка для ‘AMAZON’ и ‘RACKSPACE’
Типа такого:

try:
    assert "AMAZON" in resp_dict.get("response").get("job")[0].get("processor")
    assert "RACKSPACE"  in resp_dict.get("response").get("job")[0].get("processor")
except (AttributeError, IndexError):
    print("The 'processor' element was not found in the response")

к сожалению вот так вот


это может быть связано с нестабильным интернет соединением?

Видимо регулярка для того же, зачем и оборачивать ассерт в try/except =)

спасибо большое, но мне нужно как дибилу… по пунктам…
можете помочь?


почему он ругается на assert?

Ругается из-за овериндентации, потом будет ругаться из-за отсутствия try
Касательно вопроса: задача вам не по зубам, если нет сил разобраться с pip и на глаз увидеть овериндент.
Касательно решения: получить исходник через requests можно, но построить из него вменяемый DOM не выйдет в этом случае. Надо смотреть в сторону костылей вроде BeautifulSoup, Selenium, Grab (последний - не факт), получать элемент по xpath //code[@class="rdmd-code lang-json"] и дальше итерироваться по наследникам, т.к. элементы в блоке кода это не просто форматированный текст (см.скриншот)

скрин

1 Симпатия

я понимаю, что задача не по зубам… к сожалению… возможности самообучению есть только такие… вот и пытаюсь грызть задачи… и искать решения…
спасибо большое за помощь.

Это не самообучение, это извращение, попытка играть в высшей лиге с низкой базы
Dive Into Python или Learning Python Лутца - это самообучение, и серьезный фундамент

1 Симпатия

Про over-индентацию уже выше объяснили.
Но есть ещё ньюанс: мой пример кода - очень примитивный, работающий “в лоб”, рассчитанный на то, что response - это чистый JSON. Если надо выдернуть этот json из страницы, то, как опять же, ответили выше - нужны другие инструменты.
И, без обид, но в данном случае перед тем, как писать код, нужно понять, как он будет выполняться. Ну, то есть, сначала надо получить данные на вход: откуда они будут браться, в каком виде они будут приходить, кто их будет стягивать? (в моём кусочке кода - никто :slight_smile: Он только обрабатывает JSON).

вот пример, выдернутый из класса.
но я согласен с коллегами, что сложно делать что-то без понимания как это работает.

def login_to_jira(self, user, url):
    url = '%s' % url + '/login.jsp'
    data = {'os_username': '%s' % user['user'], 'os_password': '%s' % user['password'], 'login': 'Log In'}
    headers = {'X-Requested-With': 'XMLHttpRequest'}
    rs = requests.Session()
    r = rs.post(url, data=data, headers=headers)
    assert r.cookies.get_dict()['JSESSIONID']
    pickle.dump(r.cookies.get_dict(), open(os.path.join(os.getcwd(), "cookies_jira_api.pkl"), "wb"))
    return r.cookies.get_dict()['JSESSIONID']

def get_jira_cookies(self):
    try:
        self.cookies = pickle.load(open(os.path.join(os.getcwd(), "cookies_jira_api.pkl"), "rb"))
    except (FileNotFoundError, TypeError, EOFError):
        self.login_to_jira(data.user(), data.url())
        self.cookies = pickle.load(open(os.path.join(os.getcwd(), "cookies_jira_api.pkl"), "rb"))

# ---- return worklog for issue ----#
def get_worklog_for_issue(self, url):
    self.get_jira_cookies()
    issues = sql.get_issues()
    for i in range(len(issues)):
        response = requests.get(url + '/rest/api/2/issue/' + issues[i][1] + '/worklog', cookies=self.cookies)
        response_json = json.loads(response.text)
        users = []
        work_log = []
        for j in range(response_json['total']):
            user = response_json['worklogs'][j]['author']['name']
            users.append(user)
            date_log = response_json['worklogs'][j]['started'][0:response_json['worklogs'][j]['started'].find('T')]
            time_log = response_json['worklogs'][j]['timeSpentSeconds']
            work_log.append((user, issues[i][0], date_log, time_log))

Без обид, но постить подобный код - это скорее демонстрация: как делать не стоит, нежели полезный пример :upside_down_face: