从python对象导出JSON数据

时间:2017-04-11 16:36:46

标签: python json

我试图在python中创建一个电话簿,我想将所有联系人保存在一个文件中,编码为JSON,但是当我尝试从文件中读取导出的JSON数据时,我收到一个错误:

Extra data: line 1 column 103 - line 1 column 210 (char 102 - 209)

当我在" list.txt" 中只有一个对象时它工作正常

这是我的代码:

class contacts:
    def __init__(self, name="-", phonenumber="-", address="-"):
        self.name= name
        self.phonenumber= phonenumber
        self.address= address
        self.jsonData=json.dumps(vars(self),sort_keys=False, indent=4)
        self.writeJSON(self.jsonData)

    def writeJSON(self, jsonData):
        with open("list.txt", 'a') as f:  
            json.dump(jsonData, f)


ted=contacts("Ted","+000000000","Somewhere")

with open('list.txt') as p:
    p = json.load(p)
    print p

list.txt中的输出

"{\n    \"phonenumber\": \"+000000000\", \n    \"name\": \"Ted\", \n    \"address\": \"Somewhere\"\n}"

现在,如果我添加另一个对象,它就不能再读取JSON数据了。如果我这样做的方式是错误的,我还应该如何导出类中每个对象的JSON代码,以便在需要时可以回读它?

2 个答案:

答案 0 :(得分:2)

这不起作用的原因是此代码路径为您提供了无效的JSON结构。只需一个联系人即可获得:

{"name":"", "number":""}

有了2个联系人,你最终会得到这个:

{"name":"", "number":""}{"name":"", "number":""}

第二个是无效的json,因为2个对象应该在数组中编码,如下所示:

[{"name":"", "number":""},{"name":"", "number":""}]

代码设计的问题在于,每次创建联系人时都要写入文件。更好的想法是创建所有联系人,然后立即将它们全部写入文件。这样更干净,并且运行速度更快,因为文件I / O是计算机可以做的最慢的事情之一。

我的建议是创建一个名为Contact_Controller的新类,并在那里处理你的文件IO。像这样:

import json

class Contact_Controller:
    def __init__(self):
        self.contacts = []

    def __repr__(self):
        return json.dumps(self)

    def add_contact(self, name="-", phonenumber="-", address="-"):
        new_contact = Contact(name,phonenumber,address)
        self.contacts.append(new_contact)
        return new_contact

    def save_to_file(self):
        with open("list.txt", 'w') as f:
            f.write(str(self.contacts))

class Contact:
    def __init__(self, name="-", phonenumber="-", address="-"):
        self.name= name
        self.phonenumber= phonenumber
        self.address= address

    def __repr__(self):
        return json.dumps({"name": self.name, "phonenumber": self.phonenumber, "address": self.address})

contact_controller = Contact_Controller()

ted = contact_controller.add_contact("Ted","+000000000","Somewhere")
joe = contact_controller.add_contact("Joe","+555555555","Somewhere Else")

contact_controller.save_to_file()

with open('list.txt') as p:
    p = json.load(p)
    print(p)

我还将其更改为使用内置的__repr__()类方法。只要需要对象的字符串表示,Python就会调用该方法。

答案 1 :(得分:0)

writeJSON中,您打开了追加文件(mode='a'),该文件第一次运行正常,但后续调用无效。要解决此问题,请使用覆盖模式('w')打开文件:

        with open("list.txt", 'w') as f: