Le passage d'un objet JSON par la POSTE à l'aide de Python
Je suis en train de poster un objet JSON par le biais d'un POST. Je suis en train de le faire comme suit:
import json, urllib, urllib2
filename = 'test.json'
race_id = 2530
f = open(filename, 'r')
fdata = json.loads(f.read())
f.close()
prefix = 'localhost:8000'
count = 0
for points in fdata['positions'].iteritems():
print '--' + str(count) + '--------'
url = 'http://'+prefix+'/api/points'
parameters = {'point_data': json.dumps(points), 'race_id': race_id}
data = urllib.urlencode(parameters)
print data
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
count += 1
break;
print 'Finished adding points'
Ensuite, les données sont reçues sur l'autre extrémité (je suis en utilisant Google App Engine) avec:
point_data = json.load(self.request.get('point_data'))
Mais j'obtiens l'erreur suivante:
ERROR 2010-06-30 15:08:05,367
__init__.py:391] 'unicode' object has no attribute 'read' Traceback (most
recent call last): File
"/home/ian/workspace/google_appengine/google/appengine/ext/webapp/__init__.py",
line 513, in __call__
handler.post(*groups) File "/home/ian/workspace/codebase/track_builder/geo-api.py",
line 276, in post
point_data = json.load(self.request.get('point_data'))
File
"/home/ian/workspace/google_appengine/lib/django/django/utils/simplejson/__init__.py",
line 208, in load
return cls(encoding=encoding, **kw).decode(fp.read()) AttributeError: 'unicode' object has
no attribute 'read' INFO
2010-06-30 15:08:05,376
dev_appserver.py:3266] "POST
/api/points HTTP/1.1" 500 -
Aucune idée sur comment résoudre ce problème?
EDIT: Comme demandé voici un exemple de points:
(u'1276859700',
{
u'24': {
u'tempc': u'-22.7',
u'gpsq': u'1',
u'altm': u'65527',
u'hd': u'112',
u'hdop': u'0.93',
u'bton': u'0',
u'maxv': u'20.15',
u'idit': u'1',
u'satc': u'10',
u'minv': u'20.15',
u'lat': u'35.271993',
u'btusr': u'0',
u'lng': u'-121.845353',
u'knots': u'7'
},
u'11': {
u'tempc': u'13.0',
u'gpsq': u'1',
u'altm': u'65535',
u'hd': u'130',
u'hdop': u'0.84',
u'bton': u'0',
u'maxv': u'15.96',
u'idit': u'1',
u'satc': u'12',
u'minv': u'15.88',
u'lat': u'34.877815',
u'btusr': u'0',
u'lng': u'-121.386116',
u'knots': u'8'
}
}
EDIT 2:
Merci à Daniel Roseman et Nick Johnson qui a attiré mon erreur. J'ai changé
point_data = json.loads(self.request.get('point_data'))
Ce qui a résolu l'erreur, mais, maintenant, je suis arriver:
ERROR 2010-06-30 16:07:29,807 __init__.py:391] 'list' object has no attribute 'iteritems'
Traceback (most recent call last):
File "/home/ian/workspace/google_appengine/google/appengine/ext/webapp/__init__.py", line 513, in __call__
handler.post(*groups)
File "/home/ian/workspace/codebase/track_builder/geo-api.py", line 255, in post
for time, units in point_data.iteritems():
AttributeError: 'list' object has no attribute 'iteritems'
INFO 2010-06-30 16:07:29,816 dev_appserver.py:3266] "POST /api/points HTTP/1.1" 500 -
qui concerne le code suivant:
class TrackPoint(webapp.RequestHandler):
def post(self):
point_data = json.loads(self.request.get('point_data'))
race_id = self.request.get('race_id')
added = []
failed = []
for time, units in point_data.iteritems():
for unit, data in units.iteritems():
...
Toutes les idées sur ce que c'est?
Puisque vous n'avez pas fourni le réel
Pouvez-vous re-collez le stacktrace que le code, plutôt que de faire un devis? AFIN de citations a détruit la mise en forme d'origine, et c'est presque illisible.
points
objet, il est impossible de dire ce qu'il a été encodé, ou pourquoi il ne peut pas être codé. Vous pouvez imprimer la points
objet afin que nous puissions voir ce que c'est.Pouvez-vous re-collez le stacktrace que le code, plutôt que de faire un devis? AFIN de citations a détruit la mise en forme d'origine, et c'est presque illisible.
OriginalL'auteur blcArmadillo | 2010-06-30
Vous devez vous connecter pour publier un commentaire.
Il ressemble
self.request.get()
est de retour unicode objet plutôt qu'un fichier objet semblable. Vous pouvez essayer d'utiliserjson.loads()
au lieu dejson.load()
.juste pour clarifier, l'erreur ici est
load
essaie d'ouvrir le fichier puis de charger les données, où que des charges() est pour le texte.OriginalL'auteur Daniel Roseman
json.load() s'attend à un fichier objet, mais de soi.demande.obtenir retourne la valeur du paramètre une chaîne de caractères.
La solution est simple: utiliser json.les charges.
Aussi, un petit conseil: je présume que le nom que vous regroupons votre propre copie de la librairie json. App Engine comprend en fait une copie de simplejson que vous pouvez utiliser - il suffit de faire:
OriginalL'auteur Nick Johnson
première en js je reconnais que l'objet json doit dans un format de CHAÎNE (fichier javascript)
puis en fga
OriginalL'auteur nguyên