在Python中序列化JSON
我知道网上有很多关于json和python的问题,但我就是搞不懂这个。我想把两个列表保存到同一个文件里。为此,我创建了一个新的类来存放这两个列表:
class newJSON(object):
def __init__(self, list1, list2):
self.data = {'data': list1, 'info' : list2}
我希望生成的数据文件看起来像这样:
{
"data" : [
{
"name" : "aName" ,
"coordinates" : {"obj2" : 33, "obj3" : 71}
} , {
"name" : "bName" ,
"coordinates" : {"obj2" : 12, "obj3" : 77}
}
] ,
"info" : [
{
"first" : ["xxx" , "yyy"] ,
"space" : 21
} , {
"first" : ["aaa" , "bbb"] ,
"space" : 12
}
]
}
然后我去按照推荐的方法解码这个对象,具体可以参考将python对象实例序列化为JSON以及其他一些帖子:
jsonToEncode = newJSON(myList1, myList2)
myNewJSONData = json.dumps(jsonToEncode.__dict__)
但是我遇到了“不是JSON可序列化的错误”……我尝试过有和没有dict的情况,但都没有成功。生成的JSON必须是上面显示的格式。问题出在哪里呢?
谢谢
****编辑****
为了生成这两个列表,我使用一个格式完全和上面显示的json文件,然后做了以下操作:
list1 = [obj1(**myObj) for myObj in data["data"]]
list2也是这样做的。obj1是这样创建的:
class obj1(object):
def__init__(self, name, coordinates):
self.name = name
self.coordinate = coordinates
4 个回答
0
试试这个:
myNewJSONData = json.dumps(jsonToEncode.data, indent=2)
或者试试这个:
>>> class newJSON2(dict):
... def __init__(self, list1, list2):
... self['data'] = list1
... self['info'] = list2
>>>
>>>
>>> json2 = newJSON2(list1, list2)
>>> json2
{'info': [{'space': 21, 'first': ['xxx', 'yyy']}, {'space': 12, 'first': ['aaa', 'bbb']}], 'data': [{'name': 'aName', 'coordinates': {'obj3': 71, 'obj2': 33}}, {'name': 'bName', 'coordinates': {'obj3': 77, 'obj2': 12}}]}
>>> print json.dumps(json2, indent=2)
{
"info": [
{
"space": 21,
"first": [
"xxx",
"yyy"
]
},
{
"space": 12,
"first": [
"aaa",
"bbb"
]
}
],
"data": [
{
"name": "aName",
"coordinates": {
"obj3": 71,
"obj2": 33
}
},
{
"name": "bName",
"coordinates": {
"obj3": 77,
"obj2": 12
}
}
]
}
>>>
0
使用 simplejson
库。
from simplejson import loads, dumps
print loads(json_string) # Converts a JSON string to dict
print dumps(python_object) # Converts any valid python object/dict to valid JSON string
可以看看这个链接:https://pypi.python.org/pypi/simplejson。
1
其实不需要新建一个对象。直接把字典序列化就可以了:
myNewJSONData = json.dumps({'data': list1, 'info': list2})
不过,你的代码本来应该能正常工作的。可能是你在 list1
和 list2
里面有一些数据是不能被序列化的。