2
votes

lire json et accéder à plusieurs clés

J'essaie de récupérer le contenu de mon fichier json via des instructions en boucle et conditionnelles en python.

Voici le contenu du fichier JSON:

print([item['year']['month']['api3'] for item in data['result']])

J'essaye pour accéder au self2 href à partir du premier objet et à l ' api3 href_1 à partir des 2ème et 3ème objets. Je peux accéder à api3 href_1 s'il n'y a pas de premier objet et qu'il imprime les clés requises.

Cependant, lorsque j'imprime le contenu avec en passant le fichier complet, il ne parvient pas à imprimer le contenu. Parce qu'elle n'obtient pas le même nom de clé pour tous les objets.

Pour imprimer

{
    "count": 3,
    "result": [
        {
            "type": "first",
            "first": {
                "_links": {
                    "self1": {
                        "href": "/c6a5c1db-cf6e-4b12-9944-a1b6451963d4"
                    },
                    "self2": {
                        "href": "https://example.com"
                    },
                    "ver": {
                        "href": "https://example1.com"
                    }
                },
                "id": "c6a5c1db-cf6e-4b12-9944-a1b6451963d4",
                "tags": []
            }
        },
        {
            "type": "year",
            "year": {
                "month": {
                    "api1": {
                        "href": "https://Ap1.com"
                    },
                    "api2": {
                        "href": "FETCH-CONTENT"
                    },
                    "api3": {
                        "href": "https://Ap3.com"
                    },
                    "api4": {
                        "href": "https://Ap4.com"
                    }
                },
                "idProvider": {
                    "id": "sfsmkfmskf",
                    "name": "Apikey"
                },
                "tags": []
            }
        },
        {
            "type": "year",
            "year": {
                "month": {
                    "api1": {
                        "href": "https://Ap11.com"
                    },
                    "api2": {
                        "href": "FETCH-CONTENT-1"
                    },
                    "api3": {
                        "href": "https://Ap13.com"
                    },
                    "api4": {
                        "href": "https://Ap14.com"
                    }
                },
                "identityProvider": {
                    "id": "00000000-0000-0000-0000-000000000000",
                    "name": ""
                },
                "tags": []
            }
        }
    ]
}

Cette ligne ci-dessus imprime les données souhaitées si le fichier json le fait ne contient pas le premier élément du tableau de résultats. Lorsque j'ai ajouté le premier élément du tableau de résultats, il ne donne aucun résultat.


7 commentaires

Je ne suis pas sûr de comprendre votre problème. Pouvez-vous s'il vous plaît afficher votre code python (ou au moins une partie de celui-ci)? Pourquoi ne pouvez-vous pas simplement faire data = json.loads (your_json_string) ? Là les données seront la liste de vos objets (dictionnaires dans ce cas). La façon dont vous accédez aux éléments dépendra du type d'objets bien sûr, mais cela peut simplement être résolu avec des instructions if, elif, else


Veuillez montrer votre code. Il est difficile de voir votre problème si vous ne montrez pas ce que vous avez fait.


@ Error-SyntacticalRemorse J'essaie de récupérer la clé et la valeur du tableau json, mais il y a des incohérences dans les données json. J'ai mis à jour la question avec le code que j'ai essayé et il imprime les données.


S'agit-il de l'intégralité du contenu JSON, pouvez-vous également fournir votre sortie attendue @RJ_Singh?


Salut @DeveshKumarSingh, la réponse que j'ai postée donne le champ fixe que nous devons spécifier explicitement quel champ nous voulons récupérer. Mon exigence est de stocker chaque élément de liste en tant qu'objet afin que nous puissions récupérer les champs d'un élément quelconque de la liste sans spécifier de champ explicitement.


@DeveshKumarSingh Non devesh, ce n'est pas tout le contenu json mais les clés sont similaires pour tous les objets du 2ème objet json.


Pouvez-vous ajouter un lien vers tout le contenu et ajouter la sortie attendue, et je peux essayer d'exécuter mon code contre celui-ci et voir ce qui se passe @RJ_Singh


3 Réponses :


2
votes

Ignorez l'élément qui a "type": "first" en utilisant l'instruction ci-dessous. Ça marche.

print ([item ['year'] ['month'] ['api3'] for item in data ['result'] if "year" in item])

Vous pouvez le voir dans l'exemple ci-dessous présenté.

>>> data = {
... "count": 3,
... "result": [
...     {
...         "type": "first",
...         "first": {
...             "_links": {
...                 "self1": {
...                     "href": "/c6a5c1db-cf6e-4b12-9944-a1b6451963d4"
...                 },
...                 "self2": {
...                     "href": "https://example.com"
...                 },
...                 "ver": {
...                     "href": "https://example1.com"
...                 }
...             },
...             "id": "c6a5c1db-cf6e-4b12-9944-a1b6451963d4",
...             "tags": []
...         }
...     },
...     {
...         "type": "year",
...         "year": {
...             "month": {
...                 "api1": {
...                     "href": "https://Ap1.com"
...                 },
...                 "api2": {
...                     "href": "FETCH-CONTENT"
...                 },
...                 "api3": {
...                     "href": "https://Ap3.com"
...                 },
...                 "api4": {
...                     "href": "https://Ap4.com"
...                 }
...             },
...             "idProvider": {
...                 "id": "sfsmkfmskf",
...                 "name": "Apikey"
...             },
...             "tags": []
...         }
...     },
...     {
...         "type": "year",
...         "year": {
...             "month": {
...                 "api1": {
...                     "href": "https://Ap11.com"
...                 },
...                 "api2": {
...                     "href": "FETCH-CONTENT-1"
...                 },
...                 "api3": {
...                     "href": "https://Ap13.com"
...                 },
...                 "api4": {
...                     "href": "https://Ap14.com"
...                 }
...             },
...             "identityProvider": {
...                 "id": "00000000-0000-0000-0000-000000000000",
...                 "name": ""
...             },
...             "tags": []
...         }
...     }
... ]}
>>> 
>>> print([item['year']['month']['api3'] for item in data['result'] if "year" in item])
[{'href': 'https://Ap3.com'}, {'href': 'https://Ap13.com'}]
>>> 


0 commentaires

2
votes

Il vous suffit de sélectionner les enregistrements avec le type correct comme en utilisant un if dans votre compréhension comme:

[
    {'href': 'https://Ap3.com'}, 
    {'href': 'https://Ap13.com'}
]

Code de test:

data = {
    "count": 3,
    "result": [
        {
            "type": "first",
            "first": {
                "_links": {
                    "self1": {
                        "href": "/c6a5c1db-cf6e-4b12-9944-a1b6451963d4"
                    },
                    "self2": {
                        "href": "https://example.com"
                    },
                    "ver": {
                        "href": "https://example1.com"
                    }
                },
                "id": "c6a5c1db-cf6e-4b12-9944-a1b6451963d4",
                "tags": []
            }
        },
        {
            "type": "year",
            "year": {
                "month": {
                    "api1": {
                        "href": "https://Ap1.com"
                    },
                    "api2": {
                        "href": "FETCH-CONTENT"
                    },
                    "api3": {
                        "href": "https://Ap3.com"
                    },
                    "api4": {
                        "href": "https://Ap4.com"
                    }
                },
                "idProvider": {
                    "id": "sfsmkfmskf",
                    "name": "Apikey"
                },
                "tags": []
            }
        },
        {
            "type": "year",
            "year": {
                "month": {
                    "api1": {
                        "href": "https://Ap11.com"
                    },
                    "api2": {
                        "href": "FETCH-CONTENT-1"
                    },
                    "api3": {
                        "href": "https://Ap13.com"
                    },
                    "api4": {
                        "href": "https://Ap14.com"
                    }
                },
                "identityProvider": {
                    "id": "00000000-0000-0000-0000-000000000000",
                    "name": ""
                },
                "tags": []
            }
        }
    ]
}
print([item['year']['month']['api3'] for item in data['result']
       if item['type'] == 'year'])

Résultats:

print([item['year']['month']['api3'] for item in data['result'] 
       if item['type'] == 'year'])


0 commentaires

0
votes

Après avoir essayé quelques combinaisons supplémentaires, le code ci-dessous a bien fonctionné.

import json
with open('C:\python\examplee.json', 'r+') as fr:
     data = json.load(fr)
     for item in data['result']:
          if item['type']=='year':
                print([item['year']['month']['api3']['href']])
          else:
               print([item['first']['_links']['self2']['href']])


0 commentaires