1503 votes

Pourquoi Python ne peut pas analyser ces données JSON ?

J'ai ce JSON dans un fichier :

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [
        "id": "valore"
    ],
    "om_points": "value",
    "parameters": [
        "id": "valore"
    ]
}

J'ai écrit ce script pour imprimer toutes les données JSON :

import json
from pprint import pprint

with open('data.json') as f:
    data = json.load(f)

pprint(data)

Ce programme soulève cependant une exception :

Traceback (most recent call last):
  File "<pyshell#1>", line 5, in <module>
    data = json.load(f)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)

Comment puis-je analyser le JSON et extraire ses valeurs ?

0 votes

@kederrac Pour la raison invoquée : "Cette question a été causée par une faute de frappe ou un problème qui ne peut plus être reproduit". Le json n'est pas valide.

0 votes

@kederrac Le problème est causé par une erreur d'utilisation et non parce qu'il peut être reproduit.

9voto

sushmit Points 1590

Si vous utilisez Python3, vous pouvez essayer de modifier votre ( connection.json ) JSON vers :

{
  "connection1": {
    "DSN": "con1",
    "UID": "abc",
    "PWD": "1234",
    "connection_string_python":"test1"
  }
  ,
  "connection2": {
    "DSN": "con2",
    "UID": "def",
    "PWD": "1234"
  }
}

Puis en utilisant le code suivant :

connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>> test1

17 votes

Cela laisse l'identifiant du fichier ouvert. with L'énoncé serait mieux

6voto

Bibin Wilson Points 498

Il existe deux types d'analyse syntaxique.

  1. Analyse des données d'un fichier à partir d'un chemin d'accès au système
  2. Analyse de JSON à partir d'une URL distante.

À partir d'un fichier, vous pouvez utiliser les éléments suivants

import json
json = json.loads(open('/path/to/file.json').read())
value = json['key']
print(json['value'])

Cet article explique l'analyse complète et l'obtention des valeurs à l'aide de deux scénarios. Analyse de JSON à l'aide de Python

0 votes

Merci beaucoup pour la méthode "analyse des données d'un fichier sur le système" !

5voto

JoboFive Points 429

Voici la version modifiée data.json fichier :

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [{
        "id": "valore"
    }],
    "om_points": "value",
    "parameters": [{
        "id": "valore"
    }]
}

Vous pouvez appeler ou imprimer des données sur la console en utilisant les lignes ci-dessous :

import json
from pprint import pprint
with open('data.json') as data_file:
    data_item = json.load(data_file)
pprint(data_item)

Sortie attendue pour print(data_item['parameters'][0]['id']) :

{'maps': [{'id': 'blabla', 'iscategorical': '0'},
          {'id': 'blabla', 'iscategorical': '0'}],
 'masks': [{'id': 'valore'}],
 'om_points': 'value',
 'parameters': [{'id': 'valore'}]}

Sortie attendue pour print(data_item['parameters'][0]['id']) :

valore

0 votes

Si nous voulons ajouter une colonne pour compter le nombre d'observations de "maps", comment pouvons-nous écrire cette fonction ?

4voto

muratgozel Points 549

En tant qu'utilisateur de python3 ,

La différence entre load y loads est important, surtout lorsque vous lisez des données json à partir d'un fichier.

Comme indiqué dans les docs :

json.load :

Désérialisez fp (un fichier texte supportant la fonction .read() ou un fichier binaire contenant un document JSON) en un objet Python en utilisant cette fonction. binaire contenant un document JSON) en un objet Python en utilisant cette table de conversion.

json.loads :

json.loads : Désérialisez s (une instance de str, bytes ou bytearray contenant un document JSON) en un objet Python en utilisant cette table de conversion. tableau.

La méthode json.load peut lire directement le document json ouvert puisqu'elle est capable de lire un fichier binaire.

with open('./recipes.json') as data:
  all_recipes = json.load(data)

En conséquence, vos données json disponibles dans un format spécifié selon cette table de conversion :

https://docs.python.org/3.7/library/json.html#json-to-py-table

0 votes

En quoi cela constitue-t-il une réponse à la question posée ? L'utilisateur utilisait la bonne méthode pour charger le fichier json.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X