web-dev-qa-db-fra.com

Conversion de JSON en dict Python

J'ai cherché autour de moi pour essayer de trouver une réponse à cette question et je n'arrive pas à la retrouver. Peut-être qu'il est trop tard dans la soirée pour trouver la réponse, alors je me tourne vers les excellents lecteurs.

Je suis en train d'extraire un fichier CouchDB des données JSON suivantes:

"{\"description\":\"fdsafsa\",\"order\":\"1\",\"place\":\"22 Plainsman Rd, Mississauga, ON, Canada\",\"lat\":43.5969175,\"lng\":-79.7248744,\"locationDate\":\"03/24/2010\"},{\"description\":\"sadfdsa\",\"order\":\"2\",\"place\":\"50 Dawnridge Trail, Brampton, ON, Canada\",\"lat\":43.7304774,\"lng\":-79.8055435,\"locationDate\":\"03/26/2010\"},"

Ces données sont stockées dans un dict Python sous la clé 'locations' dans un dict appelé 'my_plan'. Je veux convertir ces données de CouchDB en un dict Python pour pouvoir effectuer les opérations suivantes dans un modèle Django:

{% for location in my_plan.locations %}                                                           
<tr>
    <td>{{ location.place }}</td>
    <td>{{ location.locationDate }}</td>
</tr>

{% endfor %}

J'ai trouvé de nombreuses informations sur la conversion de dicts en JSON, mais rien sur le retour en arrière.

23
GrumpyCanuck

La chaîne que vous affichez n'est pas un objet codé JSON (par exemple dans un dict Python), mais plutôt comme un tableau (par exemple dans une liste) sans crochets et avec une virgule supplémentaire à la fin. Donc (avec simplejson pour la portabilité de version - la bibliothèque standard json dans 2.6 convient également bien sûr! -):

>>> import simplejson
>>> js = "{\"description\":\"fdsafsa\",\"order\":\"1\",\"place\":\"22 Plainsman Rd, Mississauga, ON, Canada\",\"lat\":43.5969175,\"lng\":-79.7248744,\"locationDate\":\"03/24/2010\"},{\"description\":\"sadfdsa\",\"order\":\"2\",\"place\":\"50 Dawnridge Trail, Brampton, ON, Canada\",\"lat\":43.7304774,\"lng\":-79.8055435,\"locationDate\":\"03/26/2010\"},"
>>> simplejson.loads('[%s]' % js[:-1])
[{'description': 'fdsafsa', 'order': '1', 'place': '22 Plainsman Rd, Mississauga, ON, Canada', 'lat': 43.596917500000004, 'lng': -79.724874400000004, 'locationDate': '03/24/2010'}, {'description': 'sadfdsa', 'order': '2', 'place': '50 Dawnridge Trail, Brampton, ON, Canada', 'lat': 43.730477399999998, 'lng': -79.805543499999999, 'locationDate': '03/26/2010'}]

Si vous voulez vraiment un dict, vous devrez spécifier comment traiter ces deux éléments non nommés, c’est-à-dire quelles clés arbitraires vous voulez leur appliquer…?

18
Alex Martelli
  • Utilisez le module json pour charger JSON. (Avant la version 2.6, utilisez le module tiers simplejson, qui possède la même API.)

    >>> import json
    >>> s = '{"foo": 6, "bar": [1, 2, 3]}'
    >>> d = json.loads(s)
    >>> print d
    {u'foo': 6, u'bar': [1, 2, 3]}
    
  • Vos données réelles ne peuvent pas être chargées de cette façon car il s’agit en fait de deux objets JSON séparés par une virgule et par une virgule de fin. Vous aurez besoin de les séparer ou de traiter autrement avec cela.

    • Où avez-vous eu cette ficelle?
37
Mike Graham
Django.utils.simplejson.loads(someJson)
2

Juste une combinaison d'autres réponses:

import json
yourString = "{\"description\":\"fdsafsa\",\"order\":\"1\",\"place\":\"22 Plainsman Rd, Mississauga, ON, Canada\",\"lat\":43.5969175,\"lng\":-79.7248744,\"locationDate\":\"03/24/2010\"},{\"description\":\"sadfdsa\",\"order\":\"2\",\"place\":\"50 Dawnridge Trail, Brampton, ON, Canada\",\"lat\":43.7304774,\"lng\":-79.8055435,\"locationDate\":\"03/26/2010\"},"
target = json.loads("[" + yourString[:-1] + "]")

les sorties

[{u'description': u'fdsafsa', u'order': u'1', u'place': u'22 Plainsman Rd, Mississauga, ON, Canada', u'lat': 43.5969175, u'lng': -79.7248744, u'locationDate': u'03/24/2010'}, {u'description': u'sadfdsa', u'order': u'2', u'place': u'50 Dawnridge Trail, Brampton, ON, Canada', u'lat': 43.7304774, u'lng': -79.8055435, u'locationDate': u'03/26/2010'}]

Comme mentionné

  • cette chaîne contient deux objets JSON, donc placez-la dans un tableau (le [])
  • il a un , final, supprimer via la syntaxe de slicing de [:-1]
0
serv-inc
Hello here my example
import json
class SimpleObject(object):
    def __init__(self, _dict):
        self.__dict__.update(_dict)

data=json.loads("{\"name\":\"Rishikesh Agrawani\", \"age\": 25}" )  
so=SimpleObject(data)
print (so.name)
print (so.age)

if you transform your data to objects is better and more fast work.
0
user1470687