Python a neexistujúce hodnoty v Json-e

Občas natrafím na Json ktorý má "dynamickú" štruktúru. Nie vždy sa v Jsone vyskytujú všetky polia preto treba pri čítaní hodnôt robiť kontrolu na existenciu kľúča.

{
    "obsah": {
        "autor": {
            "meno": "...",
            "priezvisko": "..."
        }
    }
}

Json s prázdnym obsahom

{
    "obsah": {}
}

Načítanie hodnoty "meno" prebieha nasledovne:

j = json.loads('...')

meno = None  
if 'obsah' in j and 'autor' in j['obsah'] and 'meno' in j['obsah']['autor']:  
    meno = j['obsah']['autor']['meno']

Rozmýšľal som ako "elegantne" riešiť tento problém lebo občas podmienka na existenciu kľúča bola až príliš dlhá. Napísal som si jednoduchú funkciu, ktorá načíta hodnotu zo slovníka ak existuje, ak neexistuje vráti predvolenú hodnotu. Potom je možné hodnotu načítať takto:

dict_read_value(j, 'obsah.autor.meno')  
# Definícia funkcie dict_read_value:

def dict_read_value(src, path, default=None):  
    value = src

    keys = path.split('.')
    for key in keys:
        if isinstance(value, dict) and key in value:
            value = value[key]
        else:
            return default

    return value

Bolo by celkom užitočné, keby Python mal podporu pre neexistujúce hodnoty slovníka priamo v syntaxe jazyka ako má napríklad jazyk Groovy:

def streetName = user?.address?.street  

Odkazy:

Gist: dict_read_value.py

Show Comments