2016-10-28 5 views
1

Actuellement, j'essaie de convertir les données d'un fichier de formes ESRI (.shp) en un fichier JSON en utilisant le paquet json.Conversion/Sérialisation de dictionnaires contenant une grande liste de paires de valeurs dans un fichier json en python

Dans ce processus, je veux convertir un dictionairy contenant les coordonnées d'un grand nombre de différents points:

json.dumps({"Points" : coordinates}) 

La liste « coordonnées » ressemble à:

[[-2244.677490234375, -3717.6876220703125], [-2252.7623006509266, -3717.321774721159], 
..., [-2244.677490234375, -3717.6876220703125]] 

et contient environ plusieurs des centaines de paires de coordonnées.

Cependant, lorsque je tente d'exécuter json.dumps, je reçois l'erreur suivante:

[-2244.677490234375, -3717.6876220703125] is not JSON serializable 

Ma première pensée était, qu'il ne peut pas gérer les valeurs décimales/flotteur Mais si j'exécute l'exemple de travail suivant ne contenant que deux des paires de coordonnées:

print(json.dumps({"Points" : [[-2244.677490234375, -3717.6876220703125], 
[-2244.677490234375, -3717.6876220703125]]})) 

fonctionne tt et je ne suis pas une erreur ... La sortie dans ce cas est:

{"Points": [[-2244.677490234375, -3717.6876220703125], [-2244.677490234375, -3717.6876220703125]]} 

Je ne comprends pas pourquoi cela ne fonctionne pas avec ma liste "coordonnées".

Répondre

0

L'erreur que vous constatez le plus souvent concerne les classes personnalisées. Donc, je crois que votre problème a à voir avec la façon dont pyshp fournit les valeurs de coordonnées. Je ne peux pas être sûr de voir votre code, mais en regardant la source pyshp j'ai trouvé an _Array class qui est utilisé dans quelques endroits.

class _Array(array.array): 
    """Converts python tuples to lits of the appropritate type. 
    Used to unpack different shapefile header parts.""" 
    def __repr__(self): 
    return str(self.tolist()) 

Le __repr__ pourrait expliquer pourquoi vous croyez que vous voyez une liste standard ou tuple, alors qu'en fait il est une classe personnalisée. J'ai mis en place un python fiddle qui montre l'exception lors de la fourniture de la classe _Array de pyshp à json.dumps(). Pour résoudre ce problème, transmettez coordonnées.tolist() à votre appel de vidage.

json.dumps({"Points" : coordinates.tolist()}) 
+0

Merci beaucoup !! Maintenant ça marche, mais je ne comprends toujours pas le proplem précédent ... Mes coordonnées étaient en fait des listes .. Donc quand j'ai essayé d'appliquer .tolist(), une erreur est survenue, disant que les listes n'ont pas la méthode lister(). J'ai donc converti mes listes en tableaux chiffrés, que j'ai ensuite convertis en listes en utilisant .tolist() ... Et bizarrement, maintenant ça marche :-D – Jannik

+0

Ah excellent. Il y avait certainement un problème avec les objets ... Je suppose que nous ne le saurons jamais :) – craigts

+0

BTW Je pense que vous aviez une liste des tableaux numpy, mais pas sûr à 100%. Aussi s'il vous plaît n'oubliez pas de marquer le mien comme la réponse. – craigts