2012-02-17 2 views
1

J'ai rencontré un problème très étrange: j'utilise json.dump pour écrire un fichier, puis j'utilise json.load pour lire le fichier.comment utiliser json sur mac os

Le même code peut fonctionner réussir sur Windows 7, mais il ne peut pas faire sur mac os x 10,7 Voici le code:

class Result: 
def __init__(self,name,result): 
    self.name = name 
    self.result = result 

def __repr__(self): 
    return 'Result name : %s , result : %s' % (self.name,self.result) 

class MyEncoder(json.JSONEncoder): 
def default(self,obj): 
    #convert object to a dict 
    d = {'CaseResult':{}} 
    d['CaseResult'][obj.name] = obj.result 
    return d 


def save(name,result): 
    filename = 'basic.json' 
    obj = Result(name,result) 
    obj_json = MyEncoder().encode(obj) 
    with open(filename, mode='ab+') as fp: 
     json.dump(obj_json,fp) 
     s=json.load(fp) 

save('aaa','bbb') 

dans mac os, il donne une erreur « ValueError: NO objet JSON pourrait être décodé " qui peut me dire pourquoi cela arrive et comment puis-je le résoudre

+0

Publiez votre JSON. Si le même fichier fonctionne sur Windows et pas sur MacOS, ma première estimation serait un problème d'encodage de caractères. – Hansi

+0

S'il vous plaît poster votre code Python en retrait. Pour le moment, ce n'est pas un Python valide. –

+1

Ce problème n'est pas un problème Mac OS X. Votre code initial renvoie la même erreur sous Ubuntu. –

Répondre

1

Ce problème n'est pas lié à l'exécution sur un Mac; ce code ne doit jamais travailler:

with open(filename, mode='ab+') as fp: 
    json.dump(obj_json,fp) 
    s=json.load(fp) 

En effet, après json.dump, votre pointeur de fichier est à la fin du fichier. Vous devez appeler fp.seek pour le réinitialiser à la position initiale, comme ceci:

import os 
with open(filename, mode='rb+') as fp: 
    fp.seek(0, os.SEEK_END) 
    pos = fp.tell() 
    json.dump(obj_json,fp) 
    fp.seek(pos) 
    s=json.load(fp) 
1

Je ne suis pas sûr de savoir comment cela fonctionne réellement sur Windows, mais il vous manque une recherche au début du fichier avant de lire l'objet de retour. changez votre sauvegarde/chargement à

with open(filename, mode='ab+') as fp: 
    json.dump(obj_json,fp) 
    fp.seek(0) 
    s=json.load(fp) 

et il tourne aussi bien sur MacOS aussi. Notez que vous ajoutez au fichier, donc seulement la première exécution réussit à charger l'objet, le prochain trouvera des données supplémentaires après la fin de l'objet.

+0

@phihag Bon point sur le point-virgule supplémentaire, ils ont besoin d'un bouton PyLint pour les blocs de code ;-) –