代码之家  ›  专栏  ›  技术社区  ›  artek

基于公共密钥将多个json对象分组

  •  0
  • artek  · 技术社区  · 7 年前

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

    有什么提示吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   sonus21    7 年前
    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 模块。它基于解析的数据创建另一个字典。