Python IJSON на плохо организованном JSON - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь получить данные от брокера Kontat.io MQTT. Это формат, который он предоставляет, включая ведущие b и трейлинг *

    b'[
        {
            "timestamp":1530121741,
            "sourceId":"OaBW9",
            "trackingId":"t7J5",
            "rssi":-57,
            "proximity":"IMMEDIATE",
            "scanType":"BLE",
            "deviceAddress":"ea:21:88:b3:d2:5f"
        },
        {
            "timestamp":1530121741,
            "sourceId":"OaBW9",
            "trackingId":"t7J5",
            "rssi":-68,
            "proximity":"IMMEDIATE",
            "scanType":"BLE",
            "deviceAddress":"ea:21:88:b3:d2:5f"
        }
    ]'

Поскольку в JSON нет никакой организации, кроме блоков, как я могу на самом деле извлечь из нее данные с помощью ключей?

Я пробовал:

    test = ijson.items(str(msg.payload), 'rssi.item')
    columns = list(test)
    print(columns[0])

Как видно на многих примерах, но я не могу понять, как заставить его работать, не "роясь" в деревьях JSON (как в примерах earth.europe.etc.item, видимых повсюду). Должен ли я пытаться получить rssi.item, используя индексы массивов или что-то подобное? Должен ли я обрезать JSON "B" "и конечный" ""?

Я не часто работаю с Python, поэтому я чувствую себя немного не в своей тарелке с этим.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Решено с помощью ответов Константина и juanpa.arrivillaga вместе взятых. Используется импорт json не ijson

    test = json.loads(msg.payload.decode())
    print([x.get('rssi') for x in test])
0 голосов
/ 27 июня 2018

Попробуйте это:

import json 

a = b'''[
        {
            "timestamp":1530121741,
            "sourceId":"OaBW9",
            "trackingId":"t7J5",
            "rssi":-57,
            "proximity":"IMMEDIATE",
            "scanType":"BLE",
            "deviceAddress":"ea:21:88:b3:d2:5f"
        },
        {
            "timestamp":1530121741,
            "sourceId":"OaBW9",
            "trackingId":"t7J5",
            "rssi":-68,
            "proximity":"IMMEDIATE",
            "scanType":"BLE",
            "deviceAddress":"ea:21:88:b3:d2:5f"
        }
    ]'''


b = json.loads(a)
print([x.get('rssi') for x in b])

Выход:

[-57, -68]
...