我遇到了一个非常奇怪的问题:我使用json.dump写一个文件,然后用json.load来读取文件。
相同的代码可以在Windows 7上成功运行,但在mac os x 10.7上无法运行 以下是代码:
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')
在mac os中它给出一个错误“ValueError:NO JSON对象可以被解码” 谁能告诉我为什么会这样,我该如何解决呢
答案 0 :(得分:1)
我不确定这在Windows上是如何实际运行的,但是在你读回对象之前,你错过了一个回到文件开头的搜索。将保存/加载更改为
with open(filename, mode='ab+') as fp:
json.dump(obj_json,fp)
fp.seek(0)
s=json.load(fp)
它在MacOS上运行得很好。请注意,您要附加到该文件,因此只有第一次运行成功加载对象,下一个将在对象结束后找到额外的数据。
答案 1 :(得分:1)
此问题与在Mac上运行无关;这段代码永远不会起作用:
with open(filename, mode='ab+') as fp:
json.dump(obj_json,fp)
s=json.load(fp)
这是因为在json.dump
之后,您的文件指针位于文件的末尾。您必须致电fp.seek
将其重置为初始位置,如下所示:
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)