Разбор вложенного JSON "id: value" внутри "value" - начало ответа GET и как его проанализировать - PullRequest
0 голосов
/ 11 июня 2019

Есть несколько похожих тем, НО все они описывают, как анализировать вложенный JSON, если вы знаете количество и имена идентификаторов. Что мне нужно сделать, это общий код.

Я создаю WEB-приложение, которое использует несколько различных запросов GET / POST / DELETE. Теперь я сосредоточен на разборе GET-запросов. Теперь у меня есть общий шаблон, который анализирует не вложенный ответ JSON.

мой универсальный json.html

[...]
{% if response %}
    {% for id, value in response.items %}
        <p>{{ id }}: {{ value }}</p>
    {% endfor %}
{% else %}
    <p>No IDs are available.</p>
{% endif %}
[...]

и его совершенно универсальный, отлично работает для всех ответов, которые я получаю, если они не вложены (id: value) для примера:

version: 3.4

level:

system: unix

server_time: 1560252637000

server_utc: 2

но когда я получаю вложенный ответ json, этот шаблон не так хорош. Ответ выглядит так:

transfers: [{'direct': 'SEND', 'type': 'MESSAGE', 'compatstate': 'T', 'ack': '', 'state': 'T', 'phase': 'X', 'phasestep': 'X', 'idf': 'NOW', 'idt': 'F1112091', 'frec': '', 'msg': 'test'}]

numberOfSelectedRecords: 2

numberOfUsedRecords: 2

numberOfRecords: 10000

offset: 0

добавление вида, может быть, это будет полезно:

def transfers(request, host_id):
    hostname = Host.objects.get(pk=(host_id))
    response = requests.get(
        'https://{}:1769/v1/transfers?fields=aa%bb'.format(hostname),
        verify='/cert/cacerts.pem',
        headers={'Accept': 'application/json', 'Authorization': 'Basic xxxxxxxxxxxxxxxxxxxxx'},
    ).json()
    context = {'response': response, 'hostname': hostname}
    return render(request, 'app/json.html', context)

У меня вопрос: возможно ли создать общий шаблон, который бы анализировал вложенные ответы json? Должно ли это быть проанализировано в html-шаблоне или где-то внутри представлений перед передачей его в шаблон?

1 Ответ

0 голосов
/ 11 июня 2019

Вы можете выполнить итерацию по всем парам ключ-значение следующим образом:

def iterate_over(d): 
    """ 
    This function iterate over all the key-value pairs of a dictionary
    d -- a dictionary to iterate through
    """
    if not isinstance(d, dict) and not type(d) == list:
        return

    if type(d) == list:
        for entry in d:
            iterate_over(entry)
    else:
        for k, v in d.items():
            if k == 'a key':   
                doSomething()
            if v == 'a value':
                doSomethingElse()
            if isinstance(v, dict) or type(v) == list:
                iterate_over(v)
    return 

и создать if k == 'something' или if value == 'something для каждого ключа или значения в своем ответе, для которого вы хотите выполнить некоторыеработа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...