基于公共密钥对几个json对象进行分组

问题描述 投票:0回答:1

从API我得到了json响应,如:

[{'wartosc': '3.59', 'aktualizacja': '1519933403', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'bat', 'jednostka': 'V', 'minimum': 0.0, 'maksimum': 5.0}, {'wartosc': '1020', 'aktualizacja': '1519584193', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'press', 'jednostka': 'hPa', 'minimum': 0.0, 'maksimum': 1600.0}, {'wartosc': '21.2', 'aktualizacja': '1519576134', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'temp', 'jednostka': '*C', 'minimum': -50.0, 'maksimum': 100.0}, {'wartosc': '23.8', 'aktualizacja': '1520020905', 'nazwa': 'testnode', 'nazwa_ui': 'Testowy', 'id_punktu': 15, 'jakosc_sygnalu': -75, 'czujnik': 'temp', 'jednostka': '*C', 'minimum': -50.0, 'maksimum': 100.0}, {'wartosc': '3.10', 'aktualizacja': '1520011249', 'nazwa': 'testnode', 'nazwa_ui': 'Testowy', 'id_punktu': 15, 'jakosc_sygnalu': -75, 'czujnik': 'bat', 'jednostka': 'V', 'minimum': 0.0, 'maksimum': 5.0}]

我想根据'nazwa'键对几个json对象进行分组。

例如:

{
    "artekroom": {
        "id_punktu": 1,
        "nazwa_ui": "Pokój Artura",
        "readings": [{
                "czujnik": "temp",
                "wartosc": "21.2",
                "maksimum": 100,
                "minimum": -50,
                "aktualizacja": "1519576134",
                "jednostka": "C"
            },
            {
                "czujnik": "humi",
                "wartosc": "21.2",
                "maksimum": 100,
                "minimum": -50,
                "aktualizacja": "1520011249",
                "jednostka": "hPa"
            }
        ]
    }
}

任何提示如何做到这一点?

json python-3.x dictionary grouping
1个回答
0
投票
text = "[{'wartosc': '3.59', 'aktualizacja': '1519933403', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'bat', 'jednostka': 'V', 'minimum': 0.0, 'maksimum': 5.0}, {'wartosc': '1020', 'aktualizacja': '1519584193', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'press', 'jednostka': 'hPa', 'minimum': 0.0, 'maksimum': 1600.0}, {'wartosc': '21.2', 'aktualizacja': '1519576134', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'temp', 'jednostka': '*C', 'minimum': -50.0, 'maksimum': 100.0}, {'wartosc': '23.8', 'aktualizacja': '1520020905', 'nazwa': 'testnode', 'nazwa_ui': 'Testowy', 'id_punktu': 15, 'jakosc_sygnalu': -75, 'czujnik': 'temp', 'jednostka': '*C', 'minimum': -50.0, 'maksimum': 100.0}, {'wartosc': '3.10', 'aktualizacja': '1520011249', 'nazwa': 'testnode', 'nazwa_ui': 'Testowy', 'id_punktu': 15, 'jakosc_sygnalu': -75, 'czujnik': 'bat', 'jednostka': 'V', 'minimum': 0.0, 'maksimum': 5.0}]"

# import json
# data = json.loads( text )

data = eval(text)
final_data = {}
for item in data:
    d = {"czujnik": item["czujnik"],
         "wartosc": item["wartosc"],
         "maksimum": item["maksimum"],
         "minimum": item["minimum"],
         "aktualizacja": item["aktualizacja"],
         "jednostka": item["jednostka"]}

    if item['nazwa'] in final_data:
        final_data[item['nazwa']]['readings'].append(d)
    else:
        final_data[item['nazwa']] = {
            "id_punktu": item["id_punktu"],
            "nazwa_ui": item["nazwa_ui"],
            "readings": [d]
        }
print(final_data)

https://ideone.com/5jPWG8

您需要迭代解析的JSON数据。在这里,我根据您的输入使用了eval。您也可以使用json模块。它根据解析的数据创建另一个字典。

© www.soinside.com 2019 - 2024. All rights reserved.