简体   繁体   English

根据通用密钥对几个json对象进行分组

[英]Group several json objects based on common key

From API I got json response like: 从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}]

I would like to group several json objects based on the 'nazwa' key. 我想基于“ nazwa”键对几个json对象进行分组。

For example: 例如:

{
    "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"
            }
        ]
    }
}

Any hints how to do that ? 有什么提示怎么做吗?

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 https://ideone.com/5jPWG8

You need to iterate on the parsed JSON data. 您需要对解析的JSON数据进行迭代。 Here I've used eval based on your input. 在这里,我根据您的输入使用了eval。 You can use json module as well. 您也可以使用json模块。 It creates another dictionary based on the parsed data. 它基于解析的数据创建另一个字典。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM