如何在mac os上使用json

时间:2012-02-17 11:04:14

标签: python

我遇到了一个非常奇怪的问题:我使用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对象可以被解码” 谁能告诉我为什么会这样,我该如何解决呢

2 个答案:

答案 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)