Je suis nouveau sur Python et je n'ai pas codé depuis un moment. Existe-t-il un moyen de convertir un élément d'une structure JSON en un tableau?

Exemple

Donnée:

{
    "persons": 
        {
            "city": "Seattle", 
            "name": "Brian"
        }
}

Obligatoire:

{
    "persons": [
        {
            "city": "Seattle", 
            "name": "Brian"
        }
    ]
}

Contexte: je souhaite insérer un JSON dans une grande table de requête à l'aide d'enregistrements répétés. Mais les champs ne doivent pas être répétés, cela se produit simplement dans certains cas. Dès que j'ai un tableau, tout fonctionne bien, si le tableau est manquant, une erreur est renvoyée. Maintenant, je cherche une fonction python où je peux simplement dire faire de mon élément personnes un tableau avec un élément.

Meilleures salutations

Éditer:

Pour être un peu plus concret: ma structure ressemble à la suivante.

{
"a" : {
    "b" : [
        {
            "c" : {
                "foo" : "bar",
                ...
            },
            "d" : {
                "foo" : "bar",
                ...
            },
            "e" : "bar"
        },
        {
            "c" : [
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                },
                {
                    "foo" : "bar",
                    ...
                }
            ],
            "d" : {
                "foo" : "bar",
                    ...
            },
            "e" : "bar"
        },
        {
            "c" : {
                "foo" : "bar",
                ...
            },
            "d" : {
                "foo" : "bar",
                ...
            },
            "e" : "bar"
        }
    ]
},
"f" : {
    "foo" : "bar",
    ....
}

}

B et c peuvent être répétés mais ils n'ont pas à le faire. Quoi qu'il en soit, j'ai besoin des deux éléments en tant que tableau. Le meilleur moyen serait une fonction réutilisable avec le JSON, b et c en entrée car nous avons différents fichiers JSON avec des structures différentes.

Actuellement, j'essaie d'utiliser l'approche @ajrwhite pour atteindre mes exigences, mais je me bats un peu.

0
pegu 19 mars 2019 à 15:48

2 réponses

Meilleure réponse

Il s'agit d'un problème courant lié à l'utilisation de structures de style JSON profondément imbriquées en Python (par exemple, avec des extraits de MongoDB).

Voici une approche récursive qui enveloppe tous les dicts contenus dans un grand dict dans []:

def listify_dict(var):
    if isinstance(var, dict):
        output_dict = var.copy()
        for k, v in var.items():
            output_dict[k] = listify_dict(v)
        return [output_dict]
    elif isinstance(var, list):
        output_list = var.copy()
        for i, v in enumerate(output_list):
            output_list[i] = listify_dict(v)
        return output_list
    else:
        return var

Exemple:

test = {
    "persons": 
        {
            "city": "Seattle", 
            "name": "Brian"
        }
}
listify_dict(test)

Production:

[{'persons': [{'city': 'Seattle', 'name': 'Brian'}]}]
0
ajrwhite 19 mars 2019 à 13:10

Vous pouvez changer l'élément particulier pour répertorier et réaffecter:

j_data = {
    "persons":
        {
            "city": "Seattle",
            "name": "Brian"
        }
}

j_data['persons'] = [j_data['persons']]
print(j_data)

SORTIE :

{'persons': [{'city': 'Seattle', 'name': 'Brian'}]}

Jolie impression avec le paramètre indent :

j_data = {
    "persons":
        {
            "city": "Seattle",
            "name": "Brian"
        }
}

j_data['persons'] = [j_data['persons']]
import json
print(json.dumps(j_data, indent=4, sort_keys=True))

SORTIE :

{
    "persons": [
        {
            "city": "Seattle",
            "name": "Brian"
        }
    ]
}

MODIFIER :

Dans le cas où vous souhaitez convertir tous les éléments en liste, une simple boucle le ferait:

j_data = {
    "persons":
        {
            "city": "Seattle",
            "name": "Brian"
        },
    "cars":
        {
            "car1": "Tesla",
            "car2": "Toyota"
        }
}

for elem in j_data:
    j_data[elem] = [j_data[elem]]
# print(j_data)
import json
print(json.dumps(j_data, indent=4, sort_keys=True))

SORTIE :

{      
    "persons": [
        {
            "city": "Seattle",
            "name": "Brian"
        }
    ],
     "cars": [
        {
            "car1": "Tesla",
            "car2": "Toyota"
        }
    ]
}
2
DirtyBit 19 mars 2019 à 13:11